2010-06-27 164 views
5

我正在使用TFileSteam來打開日誌文件。我希望能夠從其他進程讀取此日誌文件。我認爲fmShareDenyWrite模式會允許這樣做。fmShareDenyWrite模式看起來不起作用

但是,如果我嘗試從其他進程打開文件,我得到一個錯誤。例如,如果我嘗試從命令行輸入文件,則會得到「該進程無法訪問該文件,因爲該文件正在被另一個進程使用」。

下面是該文件的初始化代碼:

if FileExists(AutoLogFileName) then 
    _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
      fmOpenReadWrite or fmShareDenyWrite) 
else 
    _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
      fmCreate or fmShareDenyWrite); 

注: 我使用德爾福版本6.

+1

其他應用程序打開它使用什麼模式? – mj2008 2010-06-27 21:10:06

回答

8

不知道這是否已經在D6中的錯誤,但是這是一個明顯的可能性。有關D2007報告的QC報告:QC 65767:http://qc.embarcadero.com/wc/qcmain.aspx?d=65767。這份報告現已結束,因爲它在D2010中得到了解決(確切地說是14.0.3467.22472)。

更新(由賈布爾的評論提示):

您可以創建自己的TFileStream的後裔,做孝敬模式。只需重寫Create(const AFileName: string; Mode: Word; Rights: Cardinal)構造函數(有兩個重載的構造函數)並自己處理模式參數。將代碼從原來的構造複製和更改

if Mode = fmCreate then 
    begin 
    inherited Create(FileCreate(AFileName, Rights)); 

if (Mode and fmCreate = fmCreate) then 
    begin 
    myMode := Mode and $FF; 
    if myMode = $FF then 
     myMode := fmShareExclusive; 
    inherited Create(FileCreate(AFileName, myMode, Rights)); 

其中myMode的類型是Word的一個局部變量。

+0

該QC條目也提供瞭解決方案。 – gabr 2010-06-28 06:24:03

2

mfCreate模式不與任何份額屬性行爲/正常工作。要解決,你必須創建文件處理自己並把它傳遞給構造

歡呼

+0

你能給我一個代碼示例嗎? – Aheho 2010-06-28 03:31:20

相關問題