2009-04-26 79 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。如果你只想阅读作品,你可以这样做。只需从流中读取即可。