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);
|
|
}
|
|
//+------------------------------------------------------------------+
|