C++ アプリケーションで作成および設定されたファイルを、C++ アプリケーションでまだ開いている間に、別の C# アプリケーションで読み取ることができません。
次の行でファイルを作成します。
txtFile.Open(m_FileName, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite, &e)
私も次の行を使用してみました:
txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite|CFile::shareDenyNone, &e)
と:
txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite, &e)
同じ結果で。
次に、C#アプリで、ファイルを開く2つの異なる方法を試しました:
FileStream fs = File.OpenRead(inputfilepath);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
と
byte[] buffer;
using (FileStream stream = new FileStream(inputfilepath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
}
どちらの方法でもエラーがキャッチされます。
別のプロセスで使用されているため、プロセスはファイル 'filename.txt' にアクセスできません。
C++ アプリはファイルを作成し、CreateProcess を使用して c# アプリを実行します。
C++アプリで共有権限を追加してもメモ帳でエラーが発生しないため、ファイルを読み取ろうとするc#コードに問題があると予想されますが、権限を設定しないとエラーが発生します。
最終的には、Soonts の提案で思い通りに動作するようになりました。
c++ ファイル共有オプションを次のように設定します。
txtFile.Open(m_FileName, CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite, &e)
C# アプリケーションがファイルを読み取れるようにしますが、書き込みはできません。
次のようにファイルを読み取るC#アプリで:
using (FileStream stream = new FileStream(inputfilepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
ファイル アクセスを読み取り専用に設定します。ただし、ファイル共有のアクセス許可を readwrite に設定すると、別のアプリケーションによってファイルが書き込まれている間にファイルを開くことができます。私が間違っていたのは、ファイルが開かれる前に C++ アプリケーションと競合したため、ファイル共有のアクセス許可を読み取り専用にすることでした。それで開かなくなりました。