2009-04-26 9 views
6

私はDelphi 7アプリケーションで読み込み用のテキストファイルを開こうとしていますが、別のアプリケーションが既にファイルを開いているため、I/Oエラー32(共有違反)が発生しています。私は "fmOpenReadまたはfmShareDenyNone"にFileModeを設定しようとしましたが、今はこれがテキストファイルにはあてはまらないことに気付きました。Delphi - 共有違反開封のテキストファイル

他のアプリケーションで開いているテキストファイルを読む方法はありますか?

var 
    f: TextFile; 
begin 
    FileMode := fmOpenRead or fmShareDenyNone; // FileMode IS NOT APPLICABLE TO TEXT FILES!! 
    AssignFile(f, FileName); 
    Reset(f); 
+0

なぜあなたはテキストファイルに熱心ですか?適切なファイルアクセスと共有モードを可能にするストリームクラスを使用してみませんか? – mghie

+0

私は一度に1行を読みたいので、TFileStreamにはそのためのメソッドがありません。私は、バッファをいっぱいに読んでCR/LFで分割できると思います。 – Simes

+1

'TStreamReader'を使って' TFileStream'から行を読み込むことができます。これは 'ReadLine()'メソッドを持ち、バッファリングを内部的に行います。 –

答えて

1

これで瞬時に問題が解決されます。 TStringListを使用してファイルをロードします。ちょうど電話:

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

私はテキストファイルを扱うことが判明したので、TStringListを使用することをお勧めします。さもなければ私はTFileStreamのために行くとそこにあなたの開始モードを指定することができます。

+0

は役に立ちませんか?シムズ、これを試してみましたか? –

+0

LoadFromFile()は、(少なくともDelphi 5および2007では)「fmOpenReadまたはfmShareDenyWrite」をモード用に使用します。これは間違いなくOPが望んでいるものではありません。 – mghie

+0

???しかしこれはまさにシムズが望むものです。彼はそれを使って他のプロセスを気にせずにファイルを読みたいだけです。それはちょうど彼の質問でした。 –

3

これは、他のプロセスがファイルを開いた方法によって異なります。ファイルを排他的に開いた場合は、まったく成功しません。

TextFileは古い帽子ですが、私はそれが旧式のDOSと互換性があるように排他モードで開くと思います。 TFileStreamなどを使用してください。

TStringListは、他の処理が何をしているかによっても動作します。しかし、ファイルが(.logファイルのように)書き込まれている場合、fmShareDenyWriteは機能しません。

+0

もう一方のプロセスはファイルを開いていますが、メモ帳は書き込み中に正常に開くことができます。 – Simes

+0

あなたは運が良かったようです。ただTextFileを捨てなさい。 –

+0

@Simes、私はファイルがどのように開かれているかを正確に示すプロセスを概説しています。http://stackoverflow.com/questions/737053/log-file-monitor/739328#739328 –

1

正しく覚えていれば、テキストファイルにのみ適用される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; 
+0

これは完璧ですが、コンパイルされず、ヘルプで見つけることができません。 – Simes

1

。例では、TStringListにロードするストリームを使用していること

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; 

:あなたはロックその方法を制御するために得ます。あなたが作品を読んでみたいと思ったら、それをすることができます。ただストリームから読む。

12

むしろLoadFromFileより、TStringListにするLoadFromStreamメソッドを使用します。たぶん、このような

+0

これは問題を解決して解決します。メモリ使用量に関する懸念のみがあります。ファイル全体がメモリにロードされます。これは問題になる可能性があります。 – Ghigo

関連する問題