加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:17:05 所属栏目:大数据 来源:网络整理
导读:我的应用程序缓慢地读取浮点数的TextFile.有时情况会发生变化,并且必须重写文件.一些示例代码: procedure TAMI_Column_Selector.read_continuously (file_name: string);var infile: TextFile; f: Double;begin AssignFile (infile,file_name); Reset (infi
我的应用程序缓慢地读取浮点数的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,因此您可以尝试查找符合您需求的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读