与文件一起工作。 - 页 5

 
Yedelkin:

问题1:你是否认为文件中有一个错字,应该说 "最后阅读日期",而不是 "最后打开日期 "之类的?

是的,这里是逐字记录。

lpLastAccessTime[out, optional]

一个指向FILETIME 结构的指针,用于接收文件或目录最后被访问的日期和时间。最后访问时间包括文件或目录最后被写入、读出的时间,或者在可执行文件的情况下被运行的时间。

松散的翻译 -- 最后一次访问包括最后一次读取或写入或执行(如果可执行)该文件的时间。

关于手柄的覆盖,我可能是错的,但也有这段有趣的文字。

并非所有的文件系统都能记录创建和最后一次访问时间,也并非所有的文件系统都以相同的方式记录它们。例如,在FAT上,创建时间的分辨率为10毫秒,写入时间的分辨率为2秒,而访问时间的分辨率为1天(实际上是访问日期)。因此,GetFileTime 函数可能不会返回使用SetFileTime 函数设置的相同文件时间信息。

NTFS对一个文件的最后访问时间的更新最多推迟到最后一次访问后的一个小时。NTFS也允许禁用最后访问时间的更新。默认情况下,最后访问时间在NTFS卷上不更新。

在目前的情况下,当文件属性被检索而没有 "重新打开 "句柄时,幸福是可以预期的。

显然,没有运气,至少在涉及到秒的时候没有。
 
TheXpert:

是的,这里是逐字记录。

松散的翻译 -- 最后一次访问包括最后一次读取或写入或执行(如果可执行)该文件的时间。

关于手柄的覆盖,我可能是错的,但也有这段有趣的文字。

显然,没有这样的运气,至少在涉及到秒的时候没有。

谢谢你开阔了我的思路!是啊...遗憾的是。

这个脚本说,代替 "最后读取日期 "的标识符FILE_ACCESS_DATE返回最后一次文件关闭 的时间。

int handle_file;
void OnStart()
  {
   Print("===============================================");
   handle_file=FileOpen("Ye_file2.bin",FILE_READ|FILE_WRITE|FILE_BIN);
   switch(handle_file)
     {
      case  INVALID_HANDLE: break;
      default:
         Print("Дата создания файла Ye_file2.bin: ",(datetime)FileGetInteger(handle_file,FILE_CREATE_DATE));
         for(int i=0;i<3;i++)
           {
            Sleep(2000);
            FileReadInteger(handle_file,CHAR_VALUE);
            Print("Дата последнего чтения Ye_file2.bin: ",(datetime)FileGetInteger(handle_file,FILE_ACCESS_DATE));
           }
         Sleep(3000);
         Print("Время обращения к FileClose(handle_file): ",TimeTradeServer());
         FileClose(handle_file);
     }
  }
 
TheXpert:

但是,尽管结论很狂野,但测试是有启示的,所以我们等待开发者对没有变化时功能如何工作的评论。

顺便说一下,在过去的三个月里,我没有收到任何评论,所以我暂时避免使用FileFlush()
 

在我看来,如果用FileFlush代替FileClose,应该不会使程序变慢/变快。

只是对每条记录进行循环使用是没有意义的。想象一下,如果Word在每次修改文档时都重新保存(尤其是在文档有大量文字和图片的情况下),会有多慢。FileFLush只方便保存而不关闭文件

开发者的意思一定是这样的(例如)。

OnInit - FileOpen

勾选时--文件写入文件刷新

(这里的数据是在循环中保存的-FileFlash-,不是每一次循环的传递,而是在循环结束后保存的)

OnDeinit FileClose.

FileFlash的意义在于,在Expert Advisor运行期间,一直向其中写入内容,这样你就不会不断地重新初始化文件句柄和神秘的文件缓冲区。

......niverse)

 
Yedelkin:
顺便说一下,在过去的三个月里,我没有收到任何评论,所以我暂时避免使用FileFlush()。
无论如何,它不能保证立即获救。所以用它来保存当前状态而不关闭句柄才有意义。
 
耶德尔金
顺便说一下,在过去的三个月里,我没有收到任何评论,所以我暂时避免使用FileFlush()。

为了更好地理解使用FileFlush()函数 的意义,我们应该思考一下文件输入/输出缓冲区的概念。如你所知,磁盘信息是以字节为单位存储的,而单独写入每个字节(当它们到达时)是最浪费的!因此,我们必须将每个字节都写入磁盘。如果你从 "硬件 "方面看这个过程,那么在每一个字节写入操作的请求中,操作系统都必须 "扭动硬盘驱动器的写入器头"!在这个过程中,你会发现一个很重要的问题。而硬盘是运动性的!换句话说,它是所有计算机设备中最慢的。那么,解决方案是什么呢?一个非常简单的解决方案!在计算机内存中创建了一个数据缓冲区(通常是几十KB),来自FileWrite和类似功能的数据在其中被发送。 一旦这个缓冲区被完全填满,系统就会将其作为连续的数据块完全写入硬盘,这样就不会进行不必要的驱动头操作,数据只是被写入一个机器中。现在计算一下,与分别写入相同大小的每个字节相比,一次写入32千字节的信息的速度提高了多少倍;)而计算方法也很简单...对于每一个写操作,驱动头首先被定位,然后进行写操作。而这还没有涉及到读/写操作的所有艰苦工作 :)在缓冲区的情况下,我们只需定位一次头部,并在一个流中写下整个区块。

但是,在缓冲区满之前,你的数据不会实际出现在文件中(!!),或者直到你关闭文件本身,在这种情况下,缓冲区(或者说是其中的剩余内容)会立即写入磁盘。这就是FileFlush函数的作用。当你 "写 "了一些信息到文件中,并且你需要它出现在文件中(例如,这些信息可能已经被另一个程序、指标、专家顾问使用......),那么你可以调用FileFlush函数,它将物理地将缓冲区的内容转储到磁盘(到一个文件)中

结论:频繁使用FileFlush函数或在循环中使用它,以加快文件的工作速度,将得到相反的结果,因为在每次调用时,系统需要计算I/O缓冲区中真正包含的信息量,调用操作系统并给出命令,将这部分内存写入文件中例如,循环向文件写入一个字节,并立即调用FileFlush函数,我们得到了向磁盘写入的最慢方式 BACKGROUND!!!;)

那么,如何以最快的方式向文件写入?非常简单;)不要乱来,折磨FileFlush :)在这种情况下,你可以在FileWrite和剪贴板之间得到快速的数据交换(内存操作是最快的)。 系统将观察这个缓冲区的溢出情况,如果有必要,将数据流化(对硬盘这种笨重的设备来说是最快的操作!)并清除缓冲区以接收新的数据!!。

那么问题来了--"你为什么需要FileFlush函数?"。而答案很简单--当你需要将数据物理地写入文件时,就需要它,而不考虑缓冲区的填充。我在上面举了一个关于这种必要性的例子。

Документация по MQL5: Файловые операции / FileFlush
Документация по MQL5: Файловые операции / FileFlush
  • www.mql5.com
Файловые операции / FileFlush - Документация по MQL5
 

我不得不为MQL5重写我的指标,遇到了一些严重的困惑:(

以下是代码。

  first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
  
  //--- установим доступ к массиву как к таймсерии
  ResetLastError();
  int copied=CopyTime(NULL,0,0,first_bar,TimeAsSeries);
  del();
  int handle=FileOpen("Price Label\\"+_Symbol+tpl_ext,FILE_READ|FILE_CSV,';',CP_ACP);
  int er=GetLastError();
  ResetLastError();
  
  string sTF="";
  int TF;
  string period_name;
  string price_label;
  string price1;
  string price2;
  
  if (handle>=1){
    while(FileIsEnding(handle)==false){
      sTF = FileReadString(handle);
      TF = ResolveTF(sTF);
      period_name=FileReadString(handle);
      price_label=FileReadString(handle);
      price1=FileReadString(handle);
      price2=FileReadString(handle);
      drawe_price(TF,handle,period_name,price_label,price1,price2);
    }
    FileClose(handle);
  }
  return(0);

我想马上解释一下,我输入这么多的变量是为了在调试器中看到什么情况。而我看到...

该文件包含一堆字符串,每个字符串有5个部分被";"分割。第一次通话

sTF = FileReadString(handle);

将整个文件放入sTF变量中,采用难以理解的编码方式。从我在调试器中看到的情况来看(在sTF变量中,它把文件内容读成unicode!)。打开文件 时,我尝试了所有可用的代码页,但结果是一样的:( 文件本身是用Windows编码写的。

有没有人知道这只狗被埋在哪里?

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
Файловые операции / FileOpen - Документация по MQL5
 

is_vale

谢谢大家分享信息!我将重新潜心研究这个话题。

 
FILE_ANSI
 
is_vale:

有没有人知道问题出在哪里?

我已经很久没有接触过文件操作了...看,当使用FileOpen() 时,你有一个CSV文件声明 它用来指定所有写入的项目都转换为unicode或ansi字符串。也 许这就是那条狗所在的地方?