問題は他のプログラムにある可能性があります。そのプログラムがファイルを排他的アクセス (共有なし) で開こうとしている場合、プログラムがどのようにファイルを開いたかに関係なく、失敗します。
プログラムがファイルを開こうとするときはいつでも、FileAccess および FileShare パラメーターを指定します (明示的に渡されない場合は既定値が使用されます)。
次に Windows がしなければならないことは、既存の開いているすべてのファイル ハンドルをチェックし、互換性があるかどうかを判断することです。それで、あなたの FileAccess パラメーターを他のすべての人の FileShare パラメーターと比較します。次に、逆のチェックを実行します。FileShare パラメーターが FileAccess パラメーターと一致しているかどうか。-彼らは、あなたが喜んでやっていることをやっていますか? 両方のチェックに合格した場合にのみ、特定のオープン リクエストが承認されます。
Process Monitorなどを使用して、 CreateFileに対して発行される Win32 呼び出しを実際に監視し、各プロセスが実際に何を行っているかを確認できます。
メモ帳は、読み取り/書き込み用に共有されているファイルを開くことはできますが、ファイルに書き戻すことはできません。サンプルプログラム:
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var fs = new FileStream(@"C:\Bar.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Write(System.Text.Encoding.ASCII.GetBytes("abc"),0,3);
fs.Flush();
fs.Close(); //<-- Breakpoint here
}
}
}
指定されたブレークポイントを設定し、プログラムを実行します。ブレークポイントに到達したら、メモ帳を開き、それを使用して C:\Bar.txt を開きます。すべて順調。ファイルにテキストを追加し、保存をクリックします。エラー メッセージが表示されます。