環境:VS2005 OS:XP
あるディレクトリにファイルが作成され、それが完成するまで(例えば100Mのファイ
ル)監視したいと考えています。
FindFirstChangeNotification() でファイルの作成開始は検出できますが、
作成されている間にSleep()など使ってファイルサイズチェックして変化がなくなったら
完成としたいと思っていましたが、ファイル作成に時間がかかるときなど
うまくいかないときがあります。
API/方法とかありましたら教えてください。
ファイルを作成する側のプログラムによっては不可能ではないかと。
例えばメモ帳で、「1行書いて上書き保存」を繰り返す場合とか。
もっと仕様を明確にした方がアドバイスが付きやすいと思うので、
下記のスレを読んだ後、具体的に何がしたいのか書いてみてはいかがでしょうか。
関連スレ
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060072.txt
関連すれ読みました。ありがとうございます。
他のアプリが作成するファイルを監視したいのです。
完成したら他のディレクトリにコピーするという感じです。
作成されるファイルはある程度サイズもわかっていて、
作成が終わるところでなんとかチェックしたいと考えています。
一回作成を始めると100M分ずっと書き込むのですが、
作成されているファイルのWIN32_FIND_DATAのデータの更新が
遅いような感じです。
余談ですが、WIN32_FIND_DATA はアクセスしたタイミングのファイル情報
を返すのでしょうか?
完成時のファイルサイズは正確にはわからないのですよね(何バイト以上なら完成して
いる、とか)。
その監視対象のアプリには手を加えられないのでしょうか?
>一回作成を始めると100M分ずっと書き込むのですが、
作成始めたら、終了するまでずっとOPENしっぱなしで、
終了したら、CLOSEすると考えていいのかな?
このプログラムでファイルを作り、
int main()
{
int c = 0;
for (;;) {
FILE *fp = fopen(hoge.txt, a+);
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 100; j++)
fprintf(fp, 0123456789);
fprintf(fp, \n);
}
fclose(fp);
c++;
printf(c = %d ≒ %d MB\n, c, c);
Sleep(1000);
}
return 0;
}
このプログラムで監視してみた。
#include <iostream>
#include <windows.h>
void Sub()
{
char *fileName = hoge.txt;
static int size;
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(fileName, &FindFileData);
if (hFind != INVALID_HANDLE_VALUE) {
if (size != FindFileData.nFileSizeLow) {
size = FindFileData.nFileSizeLow;
std::cout << size : << size << std::endl;
}
FindClose(hFind);
}
}
int main()
{
for (;;) {
Sub();
Sleep(100);
}
return 0;
}
100MBまで試したけど、ファイルサイズをリアルタイムで得られた。
OSやマシンスペックなどによって更新が遅れる可能性も考えられるけど、
ファイルを作成しているアプリの方で、ファイルを閉じていないのではないか?
監視対象アプリは製品ですので手を加えられません。
ファイルオープンしっぱなしかといえば、
私もたいちうさんと同様のテストアプリで試していたのですが、
ファイルクローズしないとWIN32_FIND_DATAは更新されない
ようです。
ですので、こちらから書き込みで対象ファイルのファイルオープン失敗
してくれればと思っています。失敗しなかったら
別方向で検討したいと思います。
解決ではありませんがクローズします。
皆様ありがとうございました。
縺薙s縺ォ縺。縺ッ Very impressed surfing your place, keep working
01C <a href='http://sqjvui.com/phr/'>Classic Chevrolet New Jersey</a> * <a href='http://ombsxp.com/jwz/'>Air Canada Schedules</a> * <a href='http://sqjvui.com/kle/urpbz-wkq.html'>Air Canadal</a> * <a href='http://bfxdon.com/cwj/'>United Airlines Customer Service</a