ファイルを保存するFileStreamから、すぐに.NETでロックを解除しますか?

StackOverflow https://stackoverflow.com/questions/2670429

  •  28-09-2019
  •  | 
  •  

質問

PDFファイルを保存するこのコードがあります。

FileStream fs = new FileStream(SaveLocation, FileMode.Create);
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
fs.Flush();
fs.Close();

正常に動作します。ただし、時にはロックをすぐにリリースせず、この1回の実行後に機能を実行してファイルロックの例外を引き起こします。

ファイルロックをリリースする理想的な方法はありますか 直後の fs.close()

役に立ちましたか?

解決

これが理想です:

using (var fs = new FileStream(SaveLocation, FileMode.Create))
{
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}

これは次のようにほぼ同等です。

FileStream fs =  null;
try
{
    fs = new FileStream(SaveLocation, FileMode.Create);
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}
finally
{
    if (fs != null)
    {
        ((IDisposable)fs).Dispose();
    }
}

使用 より読みやすい。


アップデート:

@Aron、今考えています

File.WriteAllBytes(SaveLocation, result.DocumentBytes);

理想よりも目にさえも見える:-)

他のヒント

使用()ステートメントを使用して、これと同じ問題が発生しています。

ここの上位の犯人の1つは、ファイルが閉じた後に忍び込むことができるウイルス対策ソフトウェアです。それをつかんで、リリースする前にウイルスが含まれていないことを確認します。

しかし、すべてのアンチウイルスソフトウェアがミックスから外れたとしても、ネットワークシェアに保存されているファイルを備えた非常に高い負荷システムでは、時々問題が発生しました。 a、咳、短いthread.sleep()、咳、閉鎖後、それを治すように見えた。誰かがより良い解決策を持っているなら、私はそれを聞いてみたいです!

ファイルが閉じた後にロックが維持される理由は想像できません。ただし、例外が提起されていてもファイルが閉じられていることを確認するために、これを使用してこれを使用することを検討する必要があります

using (FileStream fs = new FileStream(SaveLocation, FileMode.Create))
{
  fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);  
}

この後に実行される関数が同じアプリケーションの一部である場合、より良いアプローチは、プロセス全体の先頭に読み取り/書き込みのためにファイルを開くことで、次にファイルを閉じることなく各関数に渡すことです。プロセスの終わり。その後、アプリケーションがIO操作が完了するのを待つことをブロックする必要はありません。

これは、.flush()を使用するときに私のために機能しました。

 using (var imageFile = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite))
 {
     imageFile.Write(bytes, 0, bytes.Length);
     imageFile.Flush();
     imageFile.Close();
  }

Filestreamを閉じて、すぐに別のクラスでファイルを開いたときに同じ問題が発生しました。 Filestreamが別の場所で作成され、リストに保存されていたため、使用されたステートメントは解決策ではありませんでした。リストをクリアするだけでは不十分でした。

ファイルを再利用する前に、小川をガベージコレクターによって解放する必要があるようです。閉鎖と開口部の間の時間が短すぎる場合、使用できます

GC.Collect();

ストリームを閉じた直後。これは私のために働いた。

スレッドを眠らせるイアン・マーサーの解決策は同じ効果があり、GCの時間がリソースを解放するための時間を与えると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top