2

C ++ WinAPIアプリケーションでは、このコードを使用してファイルを開きます

CreateFileW(path,FILE_APPEND_DATA,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

このC++アプリでファイルを開いているときに、このコードを使用してC#アプリで読み取るためにファイルを開こうとしています

var f = new StreamReader(path);

IOExceptionが発生します「ファイルが別のプロセスによって使用されているため、プロセスはファイルにアクセスできません」

私は試した

var fs = new FileStream(path, FileMode.Open,FileAccess.Read)

同じ結果。

なぜこれが起こっているのか理解できません。C++アプリのCreateFileでFILE_SHARE_READを指定しました。C#で読むために開きます。C#アプリで開く必要があります。私は何が間違っているのですか?同時に、notepad.exeはこのファイルを開くことができます

4

1 に答える 1

4

C#アプリで使用しているFileStreamコンストラクターは、FILE_SHARE_READと同等のFileShare.Readオプションを使用してファイルを開きます。

これは、ファイルを開いている間、他のプログラムがファイルを読み取り用に開くことは許可されているが、書き込み用には許可されていないことを意味します。ただし、C ++プログラムではすでにファイルが書き込み用に開かれているため、要求した共有モードは使用できず、ファイルを開こうとして失敗します。

代わりに、これを言います:

var fs = 
  new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
于 2012-07-11T02:00:13.287 に答える