@Nishi0410

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[C++] 他のアプリからの書き込みを邪魔しないファイルの閲覧方法

Windows10上で、他のアプリからリアルタイムで連続データが書き込まれるファイルに対して、その内容を読み出すプログラムを作っています。

以下のファイル操作では、他のアプリからの書き込みで失敗してしまいます。

CStdioFile file;
CFileException e;
file.Open(fname, CFile::modeRead | CFile::shareDenyNone, &e);

該当ファイルを別のファイル名にコピーして、別名ファイルでオープンする方法も試しましたが、ファイルコピー中に書き込みが失敗するようで、連続データが欠落してしまいます。

Windows添付のメモ帳のように、ファイルを開いていても他のアプリからの書き込みに影響を与えないためには、どのようにすればよいでしょうか?

開発環境
 Visual C++ 6.0
 MFC使用

0 likes

1Answer

いくら無制限共有(CFile::shareDenyNone)で開いていても、連続データを書き込むアプリが、一切の共有を拒否(CFile::shareExclusive)してオープンしようとした場合は失敗してしまいます。
仮に、そういうアプリなのだとしたら、どうしようもないように思われます。

0Like

Comments

  1. @Nishi0410

    Questioner

    ご回答ありがとうございます。

    読み出し側(作成アプリ)がエラーになることはないので、書き込み側(市販アプリでソースファイルなし、修正不可)がCFile::shareExclusiveはしていないと思われます。

    今回は、書き込み側に影響を与えない読み出し方法を探しています。
  2. そのアプリが、ファイルを開きっぱなしにせず、書き込み毎に開閉している可能性はないでしょうか?
    読み出し側がCFile::shareDenyNoneで開いている状態で、書き込み側がCFile::shareExclusiveで開こうとすると、書き込み側がエラーします。

    アプリがファイルを閉じているときに読み出し側がCFile::shareDenyNoneで開く
     ↓
    アプリが書き込むためにCFile::shareExclusiveで開こうとする
     ↓
    アプリでエラーが発生して書き込みに失敗
  3. @Nishi0410

    Questioner

    読み出し側と書き込み側のテストプログラムを作ってみたら、書き込み側が失敗しました。(どちらもCFile::Openを使用)

    試しに、読み出し側のファイルオープンをWindowsのメモ帳を起動->終了に変更して、前出の書き込み側テストプログラムを並行で動かしていますが、まだメモ帳側、書き込み側とも失敗は発生していません。

    メモ帳のファイルオープン方法は特殊なことをしているのでしょうか。
  4. メモ帳は、最初に読み込んだ後、すぐにファイルを閉じます。
    そのため、メモ帳の読み込みとアプリの書き込みのタイミングが衝突しない限り、エラーにはなりません。
    そして、アプリが追加の書き込みを行っても、メモ帳の表示内容は変化しません。
  5. @Nishi0410

    Questioner

    何度もご回答、ありがとうございます。

    メモ帳でも読み出しと書き込みタイミングが衝突する場合は、エラーになるのですね。
    同じファイルを開く手法では難しそうなので、別のファイルにする手法を検討してみます。
  6. テストプログラムで、CFile::Open(デフォルトでCFile::shareExclusiveになるはず)でファイルを開いたままにして、同じファイルをメモ帳で開こうとすれば、メモ帳側でエラーになるのではないかと思います。

Your answer might help someone💌