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

时间:2012-04-02 20:04:11

标签: delphi file-io

我的应用程序缓慢地读取浮点数的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 //

如何编写可供阅读的文件?更具体地说:

  1. 如何编写可供阅读的文件?
  2. 当应用程序尝试读取当时的文件时如何防止崩溃 正在撰写
  3. 我的应用程序如何知道该文件已被重写?
  4. 我想我可以解决第一个问题是将文件读入内存并读取(是否有可以写入内存并从内存中读取的TextFile)?然后我仍然可以测试一个文件已被写入。

    任何人都有(优雅)解决这个问题的方法吗?

    提前致谢。

    在Windows 7上使用Delphi XE

1 个答案:

答案 0 :(得分:4)

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

如何在允许写入的同时打开文件进行读取取决于所使用的打开方法。使用CreateFile时, dwDesiredAccess 参数通常为GENERIC_READ,而 dwShareMode 参数为FILE_SHARE_READ or FILE_SHARE_WRITE。如果您使用的是TFileStream,则构造函数的模式参数应为fmOpenWrite or fmShareDenyNone。如果您使用的是AssignFileReset,那么您需要设置FileMode全局变量,但这不支持任何共享模式,因此您无法使用Pascal风格的I / O.

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

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

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