ロックされたファイルに読み取り専用のFileStreamを取得できるかどうか疑問に思っていますか?ロックされたファイルを読み込もうとすると、例外が発生するようになりました。
using (FileStream stream = new FileStream("path", FileMode.Open))
ありがとう!
ロックされたファイルに読み取り専用のFileStreamを取得できるかどうか疑問に思っていますか?ロックされたファイルを読み込もうとすると、例外が発生するようになりました。
using (FileStream stream = new FileStream("path", FileMode.Open))
ありがとう!
別のコンストラクターを試す必要があります。それらはMSDNで文書化されています。
これは賭けのように見えます:
FileStream Constructor (String, FileMode, FileAccess, FileShare)
FileAccess
FileStreamオブジェクトがファイルにアクセスする方法を決定する定数。これにより、FileStreamオブジェクトのCanReadプロパティとCanWriteプロパティが取得されます。パスがディスクファイルを指定している場合、CanSeekはtrueです。
ファイル共有
ファイルがプロセスによってどのように共有されるかを決定する定数。
using (FileStream stream = new FileStream("path", FileMode.Open))
これにより、FileShare引数のデフォルト値であるFileShare.Readが使用されます。これは、ファイルへの書き込みからプロセスを拒否します。別のプロセスがファイルに書き込んでいる場合、これは機能しません。すでに取得されている権利を拒否することはできません。
FileShare.ReadWriteを指定する必要があります。他のプロセスがFileShare.Noneを使用した場合、それでも機能しない可能性があります。回避策はありません。書き込まれているファイルへの読み取りアクセスを取得するのは面倒であることに注意してください。信頼できるファイルの終わりの表示がありません。ファイルの最後のレコードまたは行は、部分的にしか書き込まれていない可能性があります。
私は以下を使用しましたが、別のプロセスで開いている間にファイルが変更される可能性があるため、注意して使用する必要があります。
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read,FileShare.ReadWrite);
ファイルのロックを解除して、後でファイルを読み取るだけです。SysinternalsのHandle.exeを使用するか、コマンドラインオプションを指定してUnlockerを使用するだけです。どちらもファイルのロックを解除でき、プログラムを離れることなく、プログラムから簡単に実行できます。(ただし、Windows SAMファイルには使用しないでください。SAMでは機能しません;))頑張ってください!