2014-09-22 46 views
-1

我有一個Delphi5應用程序將文件(.pdf)和一個非常小的元數據文件導出到網絡位置。目的是通過輪詢的.NET應用程序處理這兩個文件,然後將其刪除。什麼可能會導致意外'使用中的文件'錯誤

我的做法是

  1. 寫擴展名爲 '第二部分'
  2. 元數據文件生成.PDF
  3. 重命名。部分文件中的.dat

的.NET進程正在尋找擴展名爲「.dat」的文件,因此我預計這兩個閱讀器/編寫者之間沒有衝突。但是,.NET過程中偶爾會記錄以下錯誤......

System.IO.IOException: The process cannot access the file '\\server\Path\FileName.dat' because it is being used by another process.

(我說的時候 - 我們正在測試,所以,當交易量上升,這可能變得更加的一個問題)

的Delphi代碼看起來是這樣的:

AssignFile(FTextFile, Format('%s\%s.part', [DMSPath, FullFileName])); 
try 
    try 
    ReWrite(FTextFile); 
    Writeln(FTextFile, MetaDataString); 
    finally 
    CloseFile(FTextFile); 
    end; 
except 
    raise ELogFileException.Create(LOGFILEWRITEFAILURE); 
end; 

然後是執行的代碼如下的單獨的方法

if FindFirst(Format('%s\*.part',[DMSPath]), faAnyFile, SearchRec) = 0 then begin 
    repeat 
    OldName := Format('%s\%s',[DMSPath, SearchRec.Name]); 
    NewName := Format('%s\%s',[DMSPath, ChangeFileExt(SearchRec.Name, '.dat')]); 
    RenameFile(OldName, NewName); 
    until FindNext(SearchRec) <> 0; 
    FindClose(SearchRec); 
end; 

我什麼都看不到內在的錯誤的代碼,我們有一對夫婦心中的補救措施,但我有2個問題

  1. 我應該嘗試不同的技術來更可靠地保護「.DAT」文件直到完全準備好
  2. 什麼情況可能導致這種情況?

到目前爲止已有一個建議的原因 - 殺毒軟件。

有關如何以不同方式生成文件的任何建議?請注意,我的應用程序是Delphi5;我想知道是否有更新的,更'原子'版本的'MoveFileA'WinApi呼叫我可以使用。

+1

這是你的AV軟件的常見原因 – 2014-09-22 15:39:23

+0

謝謝,@David - 我沒有想到這個 – 2014-09-22 15:41:18

+0

Windows搜索用於導致這個問題,雖然我避風港最近沒有看到它,所以現在可能已經修復了。如果這是您可以通過爲您創建的文件設置「不索引」屬性來解決此問題的原因。 – arx 2014-09-22 15:45:39

回答

0

在過去,我們遇到了一個文件被鎖定的問題。調查指向Windows預取。儘管受影響的文件不在網絡目錄中。

據我所知,在預取進程啓動只有工作和/或啓動時(通過註冊表項控制),所以它可能並不適用於你現在的情況。

您可以檢查 「C:\」 視窗 「\預取\」 目錄下。如果預取是活動的,它應該包含多個* .pf文件。如果有一個帶有可執行文件名的文件,可能值得研究。

0

個人來說,因爲涉及多個文件,我想創建一個單獨的鎖定文件,你寫第一(例如,myfile.lck)。如果輪詢應用程序在文件夾中看到它,則停止查找其他文件。一旦這個文件消失了,它就會深入下去。我不知道這是否會解決你遇到與否的問題,但我會試試看。 (帶有的文件。數據擴展通常由惡意惡作者創建,因此他們可以通過其他來源(如AV軟件)提出虛假問題。一個0字節的鎖文件通常是無害的,可以忽略。)

+1

難道這不會推遲問題嗎?即使消費者應用程序被更改爲首先查找鎖定文件,仍然需要讀取dat文件,因此dat仍然有可能被使用。當消費者應用程序表示該文件仍在被另一個進程使用時,我們不知道該進程是什麼。我認爲你假設它是生產者應用程序。無論哪種方式,製作者在重命名之前已經關閉了dat文件。 – 2014-09-22 22:22:31

+1

不要拿我的話來說。這就是Unix/Linux系統如何永遠做到這一點。基本上,你指的是併發問題。你需要使用某種旗幟。文件創建操作通常被認爲是原子操作。你會得到一個表示文件已經創建的返回碼,或者是一個說明文件已經存在的錯誤碼。如果存在,則不要繼續。如果你創建它,那麼繼續下去是安全的。只要確保在完成後刪除它。 – 2014-09-22 23:01:43

+0

顯然,如果有其他應用程序不遵循此協議並訪問其他文件,則不起作用。同樣,.dat文件經常由惡意軟件創建,因此如果它是您的AV軟件,我不知道您能做些什麼,除非將文件標記爲「安全」,否則甚至可能。 – 2014-09-22 23:04:07

相關問題