Delphi - 共享违规打开文本文件

时间:2009-04-26 11:09:59

标签: delphi delphi-7 text-files

我正在尝试打开一个文本文件,以便在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);

5 个答案:

答案 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;