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