Blame | Last modification | View Log | RSS feed
#ifndef __FILE_IO_H__
#define __FILE_IO_H__
#pragma warning( push )
#pragma warning( disable : 4251)
#include <fstream>
#include "DirIO.h"
#include <time.h>
#if defined(_WIN32) || defined(OS2) || defined(MSDOS)
#include <fcntl.h>
#include <io.h>
#define MY_SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY)
#else
#define MY_SET_BINARY_MODE(file)
#endif
#define EPOCH_DIFF 0x019DB1DED53E8000LL /* 116444736000000000 nsecs */
#define RATE_DIFF 10000000 /* 100 nsecs */
namespace XLib
{
class C_File;
enum { FILEERR_NONE, FILEERR_NOFILE, FILEERR_NOOPEN, FILEERR_TOSMALL, FILEERR_NOWRITE };
class SPKEXPORT FileIO
{
public:
static bool Remove(const XLib::String& filename);
static bool Exists(const XLib::String& filename);
public:
FileIO();
FileIO(const XLib::String& sFilename, bool bBinary);
FileIO(C_File* file);
~FileIO();
bool startWrite();
bool startRead();
bool startModify();
bool startAppend();
bool atEnd() const;
size_t fileSize() const;
time_t modifiedTime();
time_t GetCreationTime();
void SetCreationTime(time_t time);
bool writeSize(size_t iSize);
bool write(FileIO& file, size_t iSize);
bool write(const unsigned char* buf, ...);
bool write(const char* buf, ...);
bool write(const char* buf, size_t iSize);
bool write(const unsigned char* buf, size_t iSize);
bool put(const unsigned char c);
void close();
XLib::String readEndOfLine();
void seek(size_t iPos);
void seekEnd(size_t iPos = 0);
void seekStart(size_t iPos = 0);
size_t position();
int readSize();
bool read(unsigned char* buf, size_t iSize, bool bEndChar = false);
unsigned char* read(size_t iAmount);
unsigned char* readAll(size_t* pSize = NULL);
std::fstream& stream();
StringList readLines() const;
void readLines(StringList &files) const;
bool writeFile(const StringList &lines) const;
bool writeFileUTF(const StringList& lines) const;
bool remove();
bool rename(const XLib::String &toFile);
bool copy(const XLib::String& toFile, bool keepTime = false);
bool isOpened() const;
//bool Open ( CyString filename, bool = true );
bool open(const XLib::String& sFilename, bool bBinary = true);
XLib::String baseName() const;
const XLib::String& fullFilename() const { return m_sFilename; }
const XLib::String& filename() const { return m_sFile; }
const XLib::String& dir() const { return m_sDirIO.dir(); }
DirIO& dirIO() { return m_sDirIO; }
bool noFile() { return m_sFilename.empty(); }
size_t getFilesize() { return m_lSize; }
char* ReadToData(size_t* size);
bool WriteData(const char* data, size_t size);
bool writeString(const XLib::String& data);
bool WritePartFile(size_t* offsets, size_t numOffset);
int TruncateFile(size_t offset, size_t datasize);
bool WipeFile();
bool exists() const;
bool ExistsOld() const;
bool appendFile(const XLib::String& filename);
bool AppendData(const char* d, size_t size);
bool AppendDataToPos(const char* d, size_t size, size_t start);
bool isFileExtension(const XLib::String& ext) { return (extension().Compare(ext)) ? true : false; }
XLib::String extension();
XLib::String windowsFilename();
XLib::String changeFileExtension(const XLib::String& ext) const;
void setDir(const XLib::String& dir);
void setAutoDelete(bool bDelete);
private:
int _in() const;
int _out() const;
int _append() const;
int _inout() const;
bool _start(int iFlags, bool bSeekP);
void _readFileSize();
void _seek(int iPos, int iFrom);
bool _write(const char* buf, va_list args);
private:
XLib::String m_sFilename;
XLib::String m_sFile;
DirIO m_sDirIO;
bool m_bSeekP;
bool m_bBinary;
bool m_bAutoDelete;
std::fstream m_fId;
size_t m_lSize;
};
}
#pragma warning( pop )
#endif //__FILE_IO_H__