2009-04-26 113 views
6

我想打開一個文本文件閱讀的Delphi 7應用程序,但得到I/O錯誤32(共享衝突),因爲另一個應用程序已經打開文件。我試過將FileMode設置爲「fmOpenRead或fmShareDenyNone」,但現在意識到這並不適用於文本文件。德爾福 - 共享違規打開文本文件

有沒有辦法讀取由另一個應用程序打開的文本文件?

var 
    f: TextFile; 
begin 
    FileMode := fmOpenRead or fmShareDenyNone; // FileMode IS NOT APPLICABLE TO TEXT FILES!! 
    AssignFile(f, FileName); 
    Reset(f); 
+0

你爲什麼如此熱衷於文本文件?爲什麼不使用允許適當的文件訪問和共享模式的流類? – mghie 2009-04-26 11:57:05

+0

,因爲我想一次讀取一行,而TFileStream沒有相應的方法。我想我可以讀一個緩衝區滿並分割爲CR/LF。 – Simes 2009-04-26 12:38:46

+1

您可以使用`TStreamReader`來讀取`TFileStream`中的行。它有一個`ReadLine()`方法,並在內部爲你做緩衝。 – 2012-06-30 22:46:01

回答

1

這將立即解決您的問題。使用TStringList加載文件。請致電:

... 
var sl: TStringList; 
begin 
    sl := TStringList.create(); 
    try 
    sl.loadFromFile(Filename); 
    ...do your stuff here... 
    finally 
    freeAndNil(sl); 
    end; 
end; 

我發現處理文本文件時,最好使用TStringList。否則,我會去TFileStream,在那裏你可以指定你的開放模式。

3

這取決於其他進程如何打開文件......如果它獨佔打開文件,則根本不會成功。

而TextFile是舊帽子,我認爲它會以獨佔模式打開以兼容舊式DOS。你應該使用TFileStream或類似的。

TStringList也可能工作,再次取決於其他進程正在做什麼。但是,如果正在寫入文件(如.log文件),則fmShareDenyWrite將不起作用。

1

如果我沒有記錯的話,還有一個Textfilemode變量只適用於文本文件。

1

也許是這樣的:

vFileList := TStringList.Create; 
    try 
    vFileStream := TFileStream.Create('myfile.txt', fmOpenRead or fmShareDenyNone); 
    try 
     vFileList.LoadFromStream(vFileStream); 
    finally 
     vFileStream.Free; 
    end; 
    // Use vFileList 
    finally 
    vFileList.Free; 
    end; 
12

使用的TStringList的LoadFromStream方法,而不是LoadFromFile。你得到控制鎖定這種方式:

var 
    slFile: TStrings; 
    stream: TStream; 
begin 
    slFile := TStringList.Create; 
    try 
     stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone); 
     try 
     slFile.LoadFromStream(stream); 
     finally 
     stream.Free; 
     end; 

     //Use the stringlist 
    finally 
     slFile.Free; 
    end; 
end; 

這個例子是使用流加載到TStringList。如果你只想閱讀作品,你可以這樣做。只需從流中讀取即可。