文章 "MQL5 编程基础: 文件" - 页 2

 
Artyom Trishkin:

只有在 mql5 帮助中没有关于它们的任何字眼,但....。

4 版会有吗?

FileSave 14 发布以来,帮助中就已经有了。

您可以从网站上手动更新

 
Andrey F. Zelinsky:

对参考文献的可理解性稍作评论。

参考文献的位置不是很清楚(有明显的轻描淡写):

您应该像往常一样,先阅读帮助,然后再提出批评。如果示例没有帮助,那么任何参考都是无力的

void OnStart()
  {
   string  filename=_Symbol+"_ticks.bin";
   MqlTick ticks[];
//---
   int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
   if(copied!=-1)
     {
      PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
      //--- if the tick history is synchronised, the error code is zero
      if(!GetLastError()==0)
         PrintFormat("%s: Ticks are not synchronized, error=%d",_Symbol,copied,_LastError);
      //--- 将刻度写入文件
      if(!FileSave(filename,ticks,FILE_COMMON))
         PrintFormat("FileSave() failed, error=%d",GetLastError());
     }
 
Andrey F. Zelinsky:

如果你愿意,我可以什么都不写,只写欣赏。如果我开始钦佩,你就会说我在讽刺等等。我不能高兴。

如果你能理解这句话


我明白

intcommon_flag=0// 文件标志,默认情况下文件会被写入 <data catalogue>\MQL5\Files\ 文件夹。

 
Artyom Trishkin:

只有在 mql5 帮助中没有关于它们的任何字眼,但....。

第四版会有吗?

很遗憾,第四版中将不会有。
 
让我们编写一个有用的函数来获取文件和文件夹列表

遗憾的是,该函数不能提供完整的列表(包括所有子文件夹和其中的文件)。这就是我要添加它的原因

string GetDirectory( const string FileName )
{
  int Pos = StringFind(FileName, "\\");
  int LastPos = Pos;
  
  while (Pos >= 0)
  {
    LastPos = Pos;
    
    Pos = StringFind(FileName, "\\", Pos + 1);
  }

  return((LastPos >= 0) ? StringSubstr(FileName, 0, LastPos + 1) : "");
}

// 按过滤器返回所有文件的列表
int GetFileNames( string &FileNames[], int Pos = 0, string Filter = "*", const int Common_Flag = 0 )
{
  string FileName;
  const long handle = FileFindFirst(Filter, FileName, Common_Flag);

  if (handle != INVALID_HANDLE)
  {    
    const string Directory = GetDirectory(Filter);    
    Filter = StringSubstr(Filter, StringLen(Directory));
    
    do
    {
      const string TmpFileName = Directory + FileName;
      
      ArrayResize(FileNames, Pos + 1);      
      FileNames[Pos] = TmpFileName;      
      Pos++;
        
      if (!FileIsExist(TmpFileName, Common_Flag))
        Pos = GetFileNames(FileNames, Pos, TmpFileName + Filter, Common_Flag);
    }
    while (FileFindNext(handle, FileName));  
    
    FileFindClose(handle);
  }
  
  return(Pos);
}

过滤器的含义与文章中的相同。应用程序示例

// 记录整个沙箱结构
void OnStart()
{
  string FileNames[];
  
  const int Amount = GetFileNames(FileNames);
  
  for (int i = 0; i < Amount; i++)
    Print(FileNames[i]);
}
 

在一个地方和主题

关于交易、自动交易系统和交易策略测试的论坛

mql5 语言的特点、精妙之处和工作技巧

fxsaber, 2017.08.15 17:30

// 移动文件夹。说明与 FileMove 相同 -https://www.mql5.com/zh/docs/files/filemove
bool FolderMove( const string FolderNameSrc, const string FolderNameDst, const int Common_Flag = 0, const int Mode_Flags = FILE_REWRITE )
{
  if (FolderNameSrc == FolderNameDst)
    return(false);

  string FileName;
  const long handle = ::FileFindFirst(FolderNameSrc + "\\*", FileName, Common_Flag);

  bool Res = false;

  if (handle != INVALID_HANDLE)
  {
    do
    {
      const string TmpFileNameSrc = FolderNameSrc + "\\" + FileName;
      const string TmpFileNameDst = FolderNameDst + "\\" + FileName;

      if (::FileIsExist(TmpFileNameSrc, Common_Flag))
        Res = ::FileMove(TmpFileNameSrc, Common_Flag, TmpFileNameDst, Mode_Flags);
      else
      {
        const string TmpFileNameSrc2 = ::StringSubstr(TmpFileNameSrc, 0, ::StringLen(TmpFileNameSrc) - 1);
        const string TmpFileNameDst2 = ::StringSubstr(TmpFileNameDst, 0, ::StringLen(TmpFileNameDst) - 1);

        if (!FolderMove(TmpFileNameSrc2, TmpFileNameDst2, Common_Flag, Mode_Flags))
          Res = ::FolderCreate(TmpFileNameDst2, Mode_Flags & FILE_COMMON);
      }
    }
    while (::FileFindNext(handle, FileName));

    ::FileFindClose(handle);
  }

  return(::FolderDelete(FolderNameSrc, Common_Flag) && Res);
}
 

这篇文章很棒,非常感谢你提供的信息。

 

文章中有一个错字。在函数 "将带分隔符的文件读入数组 "的描述中,对结构的描述:

struct SLine{
   string line[];
};

和 in 应该是(在脚本中如此):

struct SLine{
   string field[];
};
 

А как можно уменшить размер файла?Примерно имею какой то BIN файл в которой поддерживаю какие то данни, потом делаю дефрагмент файла и наконец хочу умешнит его длина, потому что сзади уже есть лишное пространство.Как етого сделать?FileResize(int newSize)。

 
非常感谢这篇文章,尤其是#property tester_file 这篇文章,没有它,我就不会成功,而且会在很长一段时间里头破血流。