1
#ifndef NFILEMANAGERSTANDARDANSI_H
2
#define NFILEMANAGERSTANDARDANSI_H
4
/*-----------------------------------------------------------------------------
6
-----------------------------------------------------------------------------*/
9
class NSerializeFileReader : public NSerializer
12
NSerializeFileReader(FILE* InFile, NOutputDevice* InError, t_int InSize);
13
~NSerializeFileReader();
15
virtual bool Precache(t_int PrecacheOffset, t_int PrecacheSize);
16
virtual t_s64 Seek(t_s64 InPos, NSerializer::SeekPos seekpos);
18
virtual t_s64 GetFileSize();
20
virtual void SerializeFinal(void* Dest, t_u64 Length);
21
virtual bool isReader() {return true;}
22
virtual bool isWriter() {return false;}
26
NOutputDevice* m_Error;
31
BYTE* m_PreCacheBuffer;
32
static const t_int sBufferSize;
35
class NSerializeFileWriter : public NSerializer
38
NSerializeFileWriter(FILE* InFile, NOutputDevice* InError);
39
~NSerializeFileWriter();
41
virtual t_s64 Seek(t_s64 InPos, NSerializer::SeekPos seekpos);
43
virtual t_s64 GetFileSize();
45
virtual void SerializeFinal(void* Src, t_u64 Length);
47
virtual bool isReader() {return false;}
48
virtual bool isWriter() {return true;}
52
NOutputDevice* m_Error;
56
static const t_int sBufferSize;
59
class NFileManagerAnsi : public NFileManagerGeneric
62
NSerializer* CreateFileReader(const TCHAR* Filename, DWORD Flags, NOutputDevice* Error)
66
::_tfopen_s(&File, Filename,TEXT("rb"));
68
File = ::fopen(Filename,TEXT("rb"));
72
if(Flags & NSerializer::OutputErrorIfFail)
74
nuxError(TEXT("Failed to read file: %s"), Filename);
78
::fseek(File, 0, SEEK_END);
79
return new NSerializeFileReader(File, Error, ftell(File));
82
NSerializer* CreateFileWriter(const TCHAR* Filename, DWORD Flags, NOutputDevice* Error)
84
if(!FileExist(Filename))
87
if(Flags & NSerializer::NoOverWrite)
92
if(Flags & NSerializer::OverWriteReadOnly)
94
::_chmod(Filename, _S_IREAD | _S_IWRITE);
97
const TCHAR* Mode = (Flags & NSerializer::Append) ? TEXT("ab") : TEXT("wb");
100
::_tfopen_s(&File, Filename, Mode);
102
File = ::fopen(Filename, Mode);
106
if(Flags & NSerializer::OutputErrorIfFail)
108
nuxError(TEXT("Failed to write: %s"), Filename);
112
if(Flags & NSerializer::Append)
114
::fseek(File, 0, SEEK_END);
116
// if(Flags & NSerializer::Unbuffered)
118
// ::setvbuf(File, 0, _IONBF, 0);
120
return new NSerializeFileWriter(File, Error);
123
bool Delete(const TCHAR* Filename, bool OverWriteReadOnly = false)
125
if(OverWriteReadOnly)
126
_chmod(Filename, _S_IREAD | _S_IWRITE);
127
return (_unlink(Filename) == 0) || (errno == ENOENT);
130
bool FileExist(const TCHAR* Filename)
132
return ::_access(TCHAR_TO_ANSI(Filename), 00) == 0;
135
bool IsDirectory(const TCHAR* DirectoryName)
137
struct _stat FileInfo;
138
if(_stat(TCHAR_TO_ANSI(DirectoryName), &FileInfo))
140
if(FileInfo.st_mode & _S_IFDIR)
146
bool IsReadOnly(const TCHAR* Filename)
148
return ::_access(TCHAR_TO_ANSI(Filename), 04) == 0;
151
bool MakeDirectory(const TCHAR* Path, bool CreateCompletePath = false)
153
if(CreateCompletePath)
155
return NFileManagerGeneric::MakeDirectory(Path, CreateCompletePath);
157
if((::_mkdir(TCHAR_TO_ANSI(Path)) != 0) && (errno != EEXIST))
159
nuxDebugMsg(TEXT("[NFileManagerAnsi::MakeDirectory] Error creating directory"));
165
bool DeleteDirectory(const TCHAR* Path, bool DeleteContentFirst = false)
167
if(DeleteContentFirst)
169
return NFileManagerGeneric::DeleteDirectory(Path, DeleteContentFirst);
171
if((::_rmdir(TCHAR_TO_ANSI(Path)) != 0) && (errno != EEXIST))
173
nuxDebugMsg(TEXT("[NFileManagerAnsi::DeleteDirectory] Error deleting directory"));
179
void FindFiles(std::vector<NString>& Result, const TCHAR* Filename, bool Files, bool Directories)
182
long Handle = ::_findfirst(TCHAR_TO_ANSI(Filename), &Found);
187
const TCHAR* Name = ANSI_TO_TCHAR(Found.name);
188
if(TCharStringCompare(ANSI_TO_TCHAR(Found.name), TEXT(".")) &&
189
TCharStringCompare(ANSI_TO_TCHAR(Found.name), TEXT("..")) &&
190
!(Found.attrib & _A_SYSTEM) &&
191
!(Found.attrib & _A_HIDDEN))
193
if((Found.attrib & _A_SUBDIR) ? Directories : Files)
194
Result.push_back(NString(Name));
197
while(::_findnext(Handle, &Found) != -1);
199
::_findclose(Handle);
202
void ListFilesInDirectory(std::vector<NString>& Result, const TCHAR* DirName)
207
double GetFileAgeSeconds(const TCHAR* Filename)
209
struct stat FileInfo;
210
if(stat(TCHAR_TO_ANSI(Filename), &FileInfo))
212
time_t CurrentTime, FileTime;
213
FileTime = FileInfo.st_mtime;
216
return ::difftime(CurrentTime, FileTime);
221
time_t GetFileLastModified(const TCHAR* Filename)
223
struct stat FileInfo;
224
if(stat(TCHAR_TO_ANSI(Filename), &FileInfo))
227
FileTime = FileInfo.st_mtime;
234
bool SetDefaultDirectory()
237
return _tchdir(GetProgramDirectory().GetTCharPtr()) == 0;
239
// chdir has been deprecated in Visual 2005 for _chdir.
240
return ::chdir(TCHAR_TO_ANSI(GetProgramDirectory())) == 0;
244
NString GetCurrentDirectory()
246
char Buffer[1024]= "";
247
::_tgetcwd(Buffer, INL_ARRAY_COUNT(Buffer));
248
return NString(Buffer);
251
bool GetTimeStamp(const TCHAR* Filename, FileTimeStamp& Timestamp)
253
Memzero(&Timestamp, sizeof(Timestamp));
255
#if (defined INL_VISUAL_STUDIO_2005) || (defined INL_VISUAL_STUDIO_2008)
256
struct __stat64 FileInfo;
257
if(_tstat64(Filename, &FileInfo) == 0)
260
FileTime = FileInfo.st_mtime;
262
::_gmtime64_s(pTime, &FileTime);
264
Timestamp.Day = pTime->tm_mday;
265
Timestamp.DayOfWeek = pTime->tm_wday;
266
Timestamp.DayOfYear = pTime->tm_yday;
267
Timestamp.Hour = pTime->tm_hour;
268
Timestamp.Minute = pTime->tm_min;
269
Timestamp.Second = pTime->tm_sec;
270
Timestamp.Year = pTime->tm_year + 1900;
274
struct stat FileInfo;
275
if(stat(Filename, &FileInfo) == 0)
278
FileTime = FileInfo.st_mtime;
279
tm* pTime = ::gmtime(&FileTime);
281
Timestamp.Day = pTime->tm_mday;
282
Timestamp.DayOfWeek = pTime->tm_wday;
283
Timestamp.DayOfYear = pTime->tm_yday;
284
Timestamp.Hour = pTime->tm_hour;
285
Timestamp.Minute = pTime->tm_min;
286
Timestamp.Second = pTime->tm_sec;
287
Timestamp.Year = pTime->tm_year + 1900;
297
#endif // NFILEMANAGERSTANDARDANSI_H