| #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 | |
| } |