292 lines
12 KiB
MQL5
292 lines
12 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| File.mqh |
| |||
//| Copyright 2000-2025, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
#include <Object.mqh>
| |||
//+------------------------------------------------------------------+
| |||
//| Class CFile. |
| |||
//| Purpose: Base class of file operations. |
| |||
//| Derives from class CObject. |
| |||
//+------------------------------------------------------------------+
| |||
class CFile : public CObject
| |||
{
| |||
protected:
| |||
int m_handle; // handle of file
| |||
string m_name; // name of opened file
| |||
int m_flags; // flags of opened file
| |||
| |||
public:
| |||
CFile(void);
| |||
~CFile(void);
| |||
//--- methods of access to protected data
| |||
int Handle(void) const { return(m_handle); };
| |||
string FileName(void) const { return(m_name); };
| |||
int Flags(void) const { return(m_flags); };
| |||
void SetUnicode(const bool unicode);
| |||
void SetCommon(const bool common);
| |||
//--- general methods for working with files
| |||
int Open(const string file_name,int open_flags,const short delimiter='\t');
| |||
void Close(void);
| |||
void Delete(void);
| |||
ulong Size(void);
| |||
ulong Tell(void);
| |||
void Seek(const long offset,const ENUM_FILE_POSITION origin);
| |||
void Flush(void);
| |||
bool IsEnding(void);
| |||
bool IsLineEnding(void);
| |||
//--- general methods for working with files
| |||
void Delete(const string file_name,const int common_flag=0);
| |||
bool IsExist(const string file_name,const int common_flag=0);
| |||
bool Copy(const string src_name,const int common_flag,const string dst_name,const int mode_flags);
| |||
bool Move(const string src_name,const int common_flag,const string dst_name,const int mode_flags);
| |||
//--- general methods of working with folders
| |||
bool FolderCreate(const string folder_name);
| |||
bool FolderDelete(const string folder_name);
| |||
bool FolderClean(const string folder_name);
| |||
//--- general methods of finding files
| |||
long FileFindFirst(const string file_filter,string &returned_filename);
| |||
bool FileFindNext(const long search_handle,string &returned_filename);
| |||
void FileFindClose(const long search_handle);
| |||
};
| |||
//+------------------------------------------------------------------+
| |||
//| Constructor |
| |||
//+------------------------------------------------------------------+
| |||
CFile::CFile(void) : m_handle(INVALID_HANDLE),
| |||
m_name(""),
| |||
m_flags(FILE_ANSI)
| |||
{
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Destructor |
| |||
//+------------------------------------------------------------------+
| |||
CFile::~CFile(void)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
Close();
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set the FILE_UNICODE flag |
| |||
//+------------------------------------------------------------------+
| |||
void CFile::SetUnicode(const bool unicode)
| |||
{
| |||
//--- check handle
| |||
if(m_handle==INVALID_HANDLE)
| |||
{
| |||
if(unicode)
| |||
m_flags|=FILE_UNICODE;
| |||
else
| |||
m_flags&=~FILE_UNICODE;
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set the "Common Folder" flag |
| |||
//+------------------------------------------------------------------+
| |||
void CFile::SetCommon(const bool common)
| |||
{
| |||
//--- check handle
| |||
if(m_handle==INVALID_HANDLE)
| |||
{
| |||
if(common)
| |||
m_flags|=FILE_COMMON;
| |||
else
| |||
m_flags&=~FILE_COMMON;
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Open the file |
| |||
//+------------------------------------------------------------------+
| |||
int CFile::Open(const string file_name,int open_flags,const short delimiter)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
Close();
| |||
//--- action
| |||
if((open_flags &(FILE_BIN|FILE_CSV))==0)
| |||
open_flags|=FILE_TXT;
| |||
//--- open
| |||
m_handle=FileOpen(file_name,open_flags|m_flags,delimiter);
| |||
if(m_handle!=INVALID_HANDLE)
| |||
{
| |||
//--- store options of the opened file
| |||
m_flags|=open_flags;
| |||
m_name=file_name;
| |||
}
| |||
//--- result
| |||
return(m_handle);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Close the file |
| |||
//+------------------------------------------------------------------+
| |||
void CFile::Close(void)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
{
| |||
//--- closing the file and resetting all the variables to the initial state
| |||
FileClose(m_handle);
| |||
m_handle=INVALID_HANDLE;
| |||
m_name="";
| |||
//--- reset all flags except the text
| |||
m_flags&=FILE_ANSI|FILE_UNICODE;
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Deleting an open file |
| |||
//+------------------------------------------------------------------+
| |||
void CFile::Delete(void)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
{
| |||
string file_name=m_name;
| |||
int common_flag=m_flags&FILE_COMMON;
| |||
//--- close before deleting
| |||
Close();
| |||
//--- delete
| |||
FileDelete(file_name,common_flag);
| |||
}
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get size of opened file |
| |||
//+------------------------------------------------------------------+
| |||
ulong CFile::Size(void)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
return(FileSize(m_handle));
| |||
//--- failure
| |||
return(0);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get current position of pointer in file |
| |||
//+------------------------------------------------------------------+
| |||
ulong CFile::Tell(void)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
return(FileTell(m_handle));
| |||
//--- failure
| |||
return(0);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Set position of pointer in file |
| |||
//+------------------------------------------------------------------+
| |||
void CFile::Seek(const long offset,const ENUM_FILE_POSITION origin)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
FileSeek(m_handle,offset,origin);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Flush data from the file buffer of input-output to disk |
| |||
//+------------------------------------------------------------------+
| |||
void CFile::Flush(void)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
FileFlush(m_handle);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Detect the end of file |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::IsEnding(void)
| |||
{
| |||
//--- check handle
| |||
if(m_handle!=INVALID_HANDLE)
| |||
return(FileIsEnding(m_handle));
| |||
//--- failure
| |||
return(false);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Detect the end of string |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::IsLineEnding(void)
| |||
{
| |||
//--- checking
| |||
if(m_handle!=INVALID_HANDLE)
| |||
if((m_flags&FILE_BIN)==0)
| |||
return(FileIsLineEnding(m_handle));
| |||
//--- failure
| |||
return(false);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Deleting a file |
| |||
//+------------------------------------------------------------------+
| |||
void CFile::Delete(const string file_name,const int common_flag)
| |||
{
| |||
//--- checking
| |||
if(file_name==m_name)
| |||
{
| |||
int flag=m_flags&FILE_COMMON;
| |||
if(flag==common_flag)
| |||
Close();
| |||
}
| |||
//--- delete
| |||
FileDelete(file_name,common_flag);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Check if file exists |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::IsExist(const string file_name,const int common_flag)
| |||
{
| |||
return(FileIsExist(file_name,common_flag));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Copying file |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::Copy(const string src_name,const int common_flag,const string dst_name,const int mode_flags)
| |||
{
| |||
return(FileCopy(src_name,common_flag,dst_name,mode_flags));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Move/rename file |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::Move(const string src_name,const int common_flag,const string dst_name,const int mode_flags)
| |||
{
| |||
return(FileMove(src_name,common_flag,dst_name,mode_flags));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Create folder |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::FolderCreate(const string folder_name)
| |||
{
| |||
return(::FolderCreate(folder_name,m_flags));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Delete folder |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::FolderDelete(const string folder_name)
| |||
{
| |||
return(::FolderDelete(folder_name,m_flags));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Clean folder |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::FolderClean(const string folder_name)
| |||
{
| |||
return(::FolderClean(folder_name,m_flags));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Start search of files |
| |||
//+------------------------------------------------------------------+
| |||
long CFile::FileFindFirst(const string file_filter,string &returned_filename)
| |||
{
| |||
return(::FileFindFirst(file_filter,returned_filename,m_flags));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Continue search of files |
| |||
//+------------------------------------------------------------------+
| |||
bool CFile::FileFindNext(const long search_handle,string &returned_filename)
| |||
{
| |||
return(::FileFindNext(search_handle,returned_filename));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| End search of files |
| |||
//+------------------------------------------------------------------+
| |||
void CFile::FileFindClose(const long search_handle)
| |||
{
| |||
::FileFindClose(search_handle);
| |||
}
| |||
//+------------------------------------------------------------------+
|