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

LoadFromStreamではなく、TStringListのメソッドを使用します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

私の記憶が正しければ、テキスト ファイルのみに適用される Textfilemode 変数もあります。

于 2009-04-26T12:44:50.177 に答える
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 に答える