当前位置 : 主页 > 编程语言 > delphi >

delphi – 如何编写正在读取的文件?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我的应用程序缓慢地读取浮点数的TextFile.有时情况会发生变化,并且必须重写文件.一些示例代码: procedure TAMI_Column_Selector.read_continuously (file_name: string);var infile: TextFile; f: Double;begin Assi
我的应用程序缓慢地读取浮点数的TextFile.有时情况会发生变化,并且必须重写文件.一些示例代码:

procedure TAMI_Column_Selector.read_continuously (file_name: string);
var infile: TextFile;
    f: Double;
begin
   AssignFile (infile, file_name);
   Reset (infile);
   try
      while not EOF (infile) do
      begin
         Read (infile, f);
         process (f); // this may take quite some time, seconds or even minutes
      end; // while
   finally
      CloseFile (infile);
   end; // try..finally
end; // read_continuously //

如何编写一个可供阅读的文件?进一步来说:

>如何编写一个可供阅读的文件?
>当应用程序尝试读取此时的文件时,如何防止崩溃
正在写
>我的应用程序如何知道该文件已被重写?

我想我可以解决第一个问题是将文件读入内存并读取(是否有可以写入内存并从内存中读取的TextFile)?然后仍然是我如何测试文件已被写入.

有没有(优雅)解决这个问题的人?

提前致谢.

在Windows 7上使用Delphi XE

要写入一个也可以阅读的文件,作者通常不需要做任何特别的事情.如果打开文件的其他人都允许写入文件,那么目标编写者可以打开文件进行写入,写入文件并关闭它.如果其他人不允许写入文件,那么首先不允许目标编写者打开文件,并且它无能为力.

如何在允许写入的同时打开文件进行读取取决于所使用的打开方法.对于CreateFile,dwDesiredAccess参数是常用的GENERIC_READ,dwShareMode参数是FILE_SHARE_READ或FILE_SHARE_WRITE.如果您正在使用TFileStream,那么构造函数的mode参数应该是fmOpenWrite或fmShareDenyNone.如果您正在使用AssignFile和Reset,那么您需要设置FileMode全局变量,但这不支持任何共享模式,因此您不能使用Pascal样式的I / O.

读取同时写入的文件本身并不会导致崩溃.它肯定不会在操作系统级别引起问题.如果你的程序崩溃了,那是因为没有编写它来预测读取失败.当您阅读某些内容时,请检查API结果以确认您读取了所请求的字节数.您还可以让读写应用程序相互通信.您可以使用同步对象来序列化对文件的访问,或者编写器可能会向读取器发送信号以指示文件已更改,并且先前的读取可能不再准确.由您来处理细节.

如果读者要在内存中保留文件的副本,那么它可能不需要费心共享写访问权限.相反,它可以打开文件,只共享读访问权限,在内存中制作文件的副本,然后关闭文件.然后,编写者可以打开文件,而不必担心阅读器进程,因为没有什么可以践踏.它可以通知读者更改了某些内容,并且读者可以重新加载整个文件或只加载更改的部分. (作者将不得不告诉读者哪个部分发生了变化;如果不读取整个文件并查看它与内存副本的区别,读者就没有其他方法可以检测到它.)

保持写入不干扰读取的另一种方法是使用事务.不过,Transactional NTFS正在逐步淘汰. Microsoft已发布a list of alternatives,因此您可以尝试查找符合您需求的内容.

网友评论