Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-共享冲突打开文本文件_Delphi_Delphi 7_Text Files - Fatal编程技术网

Delphi-共享冲突打开文本文件

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

我正试图在Delphi 7应用程序中打开一个文本文件进行读取,但由于另一个应用程序已经打开了该文件,因此出现了I/O错误32(共享冲突)。我曾尝试将FileMode设置为“fmOpenRead或fmsharedynone”,但现在意识到这并不适用于文本文件

有没有一种方法可以读取其他应用程序打开的文本文件

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用于了解文件是如何打开的以及具有何种共享权限。这很好,但它无法编译,并且无法在帮助中找到它。这可以工作并解决问题。唯一关心的是内存使用情况:整个文件都加载到内存中。这可能是一个问题。