簡體   English   中英

如何編寫正在讀取的文件?

[英]How to write a file that is being read?

我的應用程序緩慢地讀取浮點數的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. 我的應用程序如何知道該文件已被重寫?

我想我可以解決第一個問題是將文件讀入內存並讀取(是否有可以寫入內存並從內存中讀取的TextFile)? 然后仍然是我如何測試文件已被寫入。

有沒有(優雅)解決這個問題的人?

提前致謝。

在Windows 7上使用Delphi XE

要寫入一個也可以閱讀的文件,作者通常不需要做任何特別的事情。 如果打開文件的其他人都允許寫入文件,那么目標編寫者可以打開文件進行寫入,寫入文件並關閉它。 如果其他人不允許寫入文件,則預期的作家將不會被允許在第一時間打開的文件,並沒有什么可以做的。

如何在允許寫入的同時打開文件進行讀取取決於所使用的打開方法。 對於CreateFiledwDesiredAccess參數是常用的GENERIC_READdwShareMode參數是FILE_SHARE_READ or FILE_SHARE_WRITE 如果您正在使用TFileStream ,那么構造函數的mode參數應該是fmOpenWrite or fmShareDenyNone 如果您正在使用AssignFileReset ,那么您需要設置FileMode全局變量,但這不支持任何共享模式,因此您不能使用Pascal樣式的I / O.

讀取同時寫入的文件本身並不會導致崩潰。 它肯定不會在操作系統級別引起問題。 如果你的程序崩潰了,那是因為沒有編寫它來預測讀取失敗。 當您閱讀某些內容時,請檢查API結果以確認您讀取了所請求的字節數。 您還可以讓讀寫應用程序相互通信。 您可以使用同步對象來序列化對文件的訪問,或者編寫器可能會向讀取器發送信號以指示文件已更改,並且先前的讀取可能不再准確。 由您來處理細節。

如果讀者要在內存中保留文件的副本,那么它可能不需要費心共享寫訪問權限。 相反,它可以打開文件,只共享讀訪問權限,在內存中制作文件的副本,然后關閉文件。 然后,編寫者可以打開文件,而不必擔心閱讀器進程,因為沒有什么可以踐踏。 它可以通知讀者更改了某些內容,並且讀者可以重新加載整個文件或只加載更改的部分。 (作者將不得不告訴讀者哪個部分發生了變化;如果不讀取整個文件並查看它與內存副本的區別,讀者就沒有其他方法可以檢測到它。)

保持寫入不干擾讀取的另一種方法是使用事務。 不過,交易型NTFS正在逐步淘汰。 Microsoft已發布備選列表 ,因此您可以嘗試查找符合您需求的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM