我正在尝试打开一个文本文件,以便在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 :(得分: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
。如果你只想阅读作品,你可以这样做。只需从流中读取。
答案 1 :(得分:3)
这取决于其他进程如何打开文件...如果它只打开文件,那么你根本不会成功。
TextFile是旧帽子,我认为它将以独占模式打开以与旧式DOS兼容。你应该使用TFileStream或类似的。
TStringList也可以工作,这取决于其他进程正在做什么。但是如果正在编写文件(如.log文件),则fmShareDenyWrite将无效。
答案 2 :(得分: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 :(得分:1)
如果我没记错的话,还有一个Textfilemode变量只适用于文本文件。
答案 4 :(得分: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;