Delphi-共享冲突打开文本文件
我正试图在Delphi 7应用程序中打开一个文本文件进行读取,但由于另一个应用程序已经打开了该文件,因此出现了I/O错误32(共享冲突)。我曾尝试将FileMode设置为“fmOpenRead或fmsharedynone”,但现在意识到这并不适用于文本文件 有没有一种方法可以读取其他应用程序打开的文本文件Delphi-共享冲突打开文本文件,delphi,delphi-7,text-files,Delphi,Delphi 7,Text Files,我正试图在Delphi 7应用程序中打开一个文本文件进行读取,但由于另一个应用程序已经打开了该文件,因此出现了I/O错误32(共享冲突)。我曾尝试将FileMode设置为“fmOpenRead或fmsharedynone”,但现在意识到这并不适用于文本文件 有没有一种方法可以读取其他应用程序打开的文本文件 var f: TextFile; begin FileMode := fmOpenRead or fmShareDenyNone; // FileMode IS NOT APPLI
var
f: TextFile;
begin
FileMode := fmOpenRead or fmShareDenyNone; // FileMode IS NOT APPLICABLE TO TEXT FILES!!
AssignFile(f, FileName);
Reset(f);
这将立即解决您的问题。使用TStringList加载文件。只要打电话:
...
var sl: TStringList;
begin
sl := TStringList.create();
try
sl.loadFromFile(Filename);
...do your stuff here...
finally
freeAndNil(sl);
end;
end;
我发现处理文本文件时,最好使用TStringList。否则,我会选择TFileStream,在那里您可以指定您的打开模式。这取决于其他进程如何打开文件。。。如果它以独占方式打开该文件,则根本不会成功 而文本文件是旧帽子,我认为它将以独占模式打开,以兼容旧式DOS。您应该使用TFileStream或类似工具
TStringList也可以工作,这同样取决于另一个进程正在做什么。但是,如果正在写入文件(如.log文件),FmSharedyWrite将无法工作。如果我没记错,还有一个Textfilemode变量仅适用于文本文件。可能如下:
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;
使用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
。如果你只想读文章,你可以这样做。只需从流中读取。LoadFromFile()使用(至少在Delphi 5和2007中是这样)fmOpenRead或fmSharedyWrite作为模式。这绝对不是OP想要的。???不过,这正是Simes想要的。他只想读取文件,而不关心使用它的其他进程。这正是他的问题。@MasterPeter,我相信cullprit mghie所说的是FmHaredenyWrite.FmHaredenyWrite“锁定”一个文件,以便其他进程只能读取。。。因为它而否决你的答案有点苛刻。问题是它会将整个文件加载到内存中。有些文件可能很大,所以我更喜欢一次只处理一行。@Lieven:两种说法你都对(我也没有对答案投反对票)@MasterPeter:如果另一个进程打开该文件进行写入(非独占),则打开该文件将失败。在这种情况下,FmSharedInOne是必要的。你为什么对文本文件如此感兴趣?为什么不使用允许正确的文件访问和共享模式的流类呢?因为我想一次读取一行,而TFileStream没有相应的方法。我想我可以在CR/LF上读取一个已满且已拆分的缓冲区。您可以使用TStreamReader
从TFileStream
读取行。它有一个ReadLine()
方法,并在内部为您进行缓冲。@RemyLebeau-我尝试使用TStreamReader,当文件被另一个应用程序打开时,它似乎给出了访问冲突。@lkessler这不是访问冲突(访问无效内存地址),这是共享冲突(打开文件的权限是同一文件的另一个打开句柄所不允许的)。这是两件不同的事情。您仍然可以使用TStreamReader
,只需先使用TFileStream
打开文件,并具有足够的共享权限即可(fmOpenRead或fmsharedynone
通常可以,除非另一个句柄以独占方式访问该文件),然后将TFileStream
传递给TStreamReader
进行读取。我不知道另一个进程是如何打开该文件的,但记事本可以在写入时成功打开它。看起来你很幸运。只需丢弃TextFile。@Simes,我概述了一个进程,它可以准确地显示文件是如何打开的,他说re:@Simes use用于了解文件是如何打开的以及具有何种共享权限。这很好,但它无法编译,并且无法在帮助中找到它。这可以工作并解决问题。唯一关心的是内存使用情况:整个文件都加载到内存中。这可能是一个问题。