9

関数と呼ばれる Page_Load に次のコードがあります。Visual Studio の起動後に初めてページが読み込まれると、すべてが正常に機能します。
しかし、その後のファイルへの他の開始呼び出しはIOException: "File is in use by another process"、VisualStudio ソリューションでファイルを直接開いた場合でも、このエラーが返されます (もちろん、例外としてではありません)。

FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open);
PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream);
//Do some stuff with the file
mailinglist_FileStream.Close();
mailinglist_Reader.Close();
mailinglist_Reader.Dispose();
mailinglist_FileStream.Dispose();

ファイルがまだロックされているのはなぜですか? また、Visual Studio を完全に再起動するとファイルがリセットされるのはなぜですか? ファイルのプロパティを確認すると、次のように表示されます。

ビルド アクション: コンテンツ
を出力ディレクトリにコピー: コピーしない

私はこのファイルを読んでいるだけです。adLockOptimistic複数のプロセスがファイルにアクセスできるように、に似たことを行うことはできますか?

4

4 に答える 4

10

ファイルがまだロックされているのはなぜですか? また、Visual Studio を完全に再起動するとファイルがリセットされるのはなぜですか? ファイルのプロパティを確認すると、[...] ファイルがまだロックされている理由がわかりません。おそらく、ストリームが閉じられる/破棄される前にコードが失敗するためです。

「Visual Studio を完全に再起動する理由 [...]」について: IDE を閉じると閉じられる IIS Express または ASP.NET Dev Server を使用している可能性があるため、ロックを保持しているプロセスが存在しないため、ファイルのロックが解除されます。より長く実行されます。

また、「なぜファイルがまだロックされているのですか?[...]」については、スレッドが正常に終了せず、ロックが解除されないことがあるため、ファイル ストリームが閉じられていないことが原因である可能性があります。

他の答えが言ったように、オブジェクトが破棄されないことusingをブロックがどのように回避できるかを確認してください。IDisposable

// FileShare.ReadWrite will allow other processes 
// to read and write the target file even if other processes 
// are working with the same file
using var mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open, FileShare.ReadWrite);
using var mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream);
      // Do your stuff. Using blocks will call Dispose() for 
      // you even if something goes wrong, as it's equal to a try/finally! 

私はこのファイルを読んでいるだけです。複数のプロセスがファイルにアクセスできるように、adLockOptimistic に似たことを行うことはできますか?

はい、File.OpenメソッドとFileShare列挙を見てください。

于 2013-02-19T11:04:14.993 に答える
8

使い方を学ぶusing

using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read))
{
    ...
}

このusing構造により、例外がスローされた場合でも、ブロックを離れるとファイルが確実に閉じられます。

問題はここではなく、コードの別の場所にある可能性があります。usingすべてのコードを調べて、ファイルを開いているがステートメント内に配置していない場所を探す必要があります。

于 2013-02-19T11:05:35.190 に答える
0

ブロックを使用してみてusingください。ロックの問題が解決しない場合がありますが、使い捨てのオブジェクトには適しています。

using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open))
{
    using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream))
    {
        ...            
    }
}

mailinglist_Readerまた、の前に閉じてみてくださいmailinglist_FileStream

于 2013-02-19T11:03:25.200 に答える