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);
4

5 回答 5

13

使用LoadFromStreamTStringList 的方法,而不是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. 如果您只想阅读片段,则可以这样做。只需从流中读取。

于 2010-05-12T02:45:02.777 回答
3

这取决于其他进程如何打开文件......如果它专门打开文件,你根本不会成功。

而且TextFile是老帽子,我认为它将以独占模式打开以兼容旧式DOS。您应该使用 TFileStream 或类似的。

TStringList 也可能起作用,这再次取决于其他进程在做什么。但如果正在写入文件(如 .log 文件),则 fmShareDenyWrite 将不起作用。

于 2009-04-26T12:40:49.437 回答
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;
于 2009-04-28T08:54:21.820 回答
1

这将立即解决您的问题。使用 TStringList 加载文件。只需致电:

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

我发现处理文本文件时,最好使用TStringList。否则我会选择 TFileStream ,在那里你可以指定你的打开模式。

于 2009-04-26T11:24:23.397 回答
1

如果我没记错的话,还有一个 Textfilemode 变量仅适用于文本文件。

于 2009-04-26T12:44:50.177 回答