blob: aa4c1cafededa53693afbde0ee0242977bf0493e [file] [log] [blame]
#include "File.h"
#include <stdio.h>
#ifdef WINDOWS
File::File(STRING filePath, bool read)
#else
File::File(STRING filePath, const char* mode)
#endif
{
_closed = false;
STRING fileFolder = Path::GetFileFolder(filePath);
#ifdef WINDOWS
SHCreateDirectoryExA (0, fileFolder, 0);
//must return ERROR_SUCCESS
#else
STRING str = (STRING)System::SafeAllocMemory(strlen(fileFolder) + 20);
strcpy(str,"mkdir -p ");
strcat(str, fileFolder);
system(str);
System::SafeFreeMemory(str);
#endif
System::SafeFreeMemory(fileFolder);
#ifdef WINDOWS
if (read)
_file = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
else
_file = CreateFileA(filePath, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
#else
_file = fopen(filePath, mode);
#endif
}
File::~File(void)
{
if ( ! _closed)
#ifdef WINDOWS
CloseHandle(_file);
#else
fclose(_file);
#endif
}
File* File::Open(STRING filePath)
{
if ( 0 == filePath)
return 0;
bool _closed = false;
//STRING fileFolder = Path::GetFileFolder(filePath);
File* file = (File*) System::SafeAllocMemory(sizeof(File));
#ifdef WINDOWS
//File* file = new File(filePath, false);
//SHCreateDirectoryExA (0, fileFolder, 0);
file->_closed = false;
file->_file = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
#else
file->_closed = false;
file->_file = fopen(filePath, "rb");
#endif
if ( 0 >= file->_file)
return 0;
return file;
}
bool File::Seek(File* file,long position, int origin)
{
if ( 0 >= _file || _closed )
return false;
#ifdef WINDOWS
return INVALID_SET_FILE_POINTER != SetFilePointer(file->_file, position, 0, origin);
#else
int seek = (origin == SEEK__BEGIN ? SEEK_SET : (origin == SEEK__CURRENT ? SEEK_CUR : SEEK_END));
int result = fseek(_file, position, seek);
return ! result;
#endif
}
bool File::Write(File* file,BYTE* buffer, UINT bytesToWrite)
{
if ( 0 >= _file || _closed )
return false;
#ifdef WINDOWS
DWORD dwWritten = 0;
WriteFile(file->_file, buffer, bytesToWrite,&dwWritten, 0);
return dwWritten == bytesToWrite;
#else
return bytesToWrite == fwrite(buffer, 1, bytesToWrite, _file);
#endif
}
bool File::Close(File* file)
{
if ( true == file->_closed )
return false;
#ifdef WINDOWS
bool result = CloseHandle(file->_file);
file->_file = 0;
file->_closed = true;
return result;
#else
if ( EOF != fclose(_file) )
{
_closed = true;
_file = 0;
return true;
}
else
return false;
#endif
}
UINT File::Read(File* file, BYTE* buffer, UINT bytesToRead)
{
if ( 0 == bytesToRead )
return 0;
if ( 0 == buffer )
return bytesToRead + 1;
if ( 0 >= file->_file || file->_closed )
return bytesToRead + 2;
#ifdef WINDOWS
DWORD dwRead = 0;
ReadFile(file->_file,buffer, bytesToRead, &dwRead, 0);
return dwRead;
#else
return (UINT)fread(buffer, 1, bytesToRead, _file);
#endif
}
File* File::Create(STRING filePath)
{
if ( 0 == filePath)
return 0;
bool _closed = false;
STRING fileFolder = Path::GetFileFolder(filePath);
File* file = (File*) System::SafeAllocMemory(sizeof(File));
file->_closed = false;
File::CreateDirectory(fileFolder);
#ifdef WINDOWS
file->_file = CreateFileA(filePath, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
#else
file->_file = fopen(filePath, "wb");
#endif
if ( 0 >= file->_file)
{
file->_closed = true;
return 0;
}
return file;
}
// return current position in file
UINT File::GetCurentPos(File* file)
{
if ( 0 >= _file || _closed )
return (UINT)-1;
#ifdef WINDOWS
return SetFilePointer(file->_file, 0, 0,FILE_CURRENT);
#else
return ftell(_file);
#endif
}
UINT File::ReadUINT(File* file)
{
if ( 0 == _file || _closed )
return (UINT)-1;
BYTE buffer[4];
Read(file,buffer,4);
return MAKE_UINT(buffer[0],buffer[1],buffer[2],buffer[3]);
}
bool File::Skip(File* file,long bytesToSkip)
{
return Seek(file,bytesToSkip,SEEK__CURRENT);
}
bool File::CreateDirectory(STRING name)
{
#ifdef WINDOWS
int result = SHCreateDirectoryExA (0, name, 0);
//ignore already exitant folders
return ( result == ERROR_SUCCESS || result == ERROR_ALREADY_EXISTS || result == ERROR_FILE_EXISTS);
#else
STRING str = (STRING)System::SafeAllocMemory(strlen(name) + 20);
strcpy(str,"mkdir -p ");
strcat(str, name);
system(str);
System::SafeFreeMemory(str);
return true;
#endif
}