1

「/test」にファイルが追加されたときに通知を受け取りたい。そこで、QFilesystemWatcher の directoryChanged シグナルを使用しました。しかし、「cp aa.txt /test」のときに directoryChanged シグナルが表示され、aa.txt を読み取ったときに不完全な aa.txt がありました。

この場合、ファイルの読み取りが完了したことをどのように知ることができますか?

参考までに、正確なファイル名がわからないため、fileChanged シグナルを使用できません。

4

1 に答える 1

0

残念ながら、ファイルに書き込むプロセスからの協力がなければ、これを一般的に知る方法はありません。書き込みプロセスは、排他的アクセスのためにファイルをロックする必要があり、読み取りプロセスは、成功するまで、つまり書き込みプロセスがロックを解除するまで、読み取りのためにファイルを開こうとし続ける必要があります。

信号が伝えるのdirectoryChangedは、箱に書かれていることだけです。ディレクトリが変更されたか、この場合、ディレクトリに新しいエントリがあります。これは、そのエントリによって表されるもの、つまりファイルの内容とは完全に別のものです。

ファイルシステム ウォッチャーは、ここで必要なものの半分にすぎません。これは Qt の問題ではなく、プロセスの問題です。あなたは作家に協力しようとしているということを忘れないでください。

回避策として、ファイルの内容を検証する何らかの方法がある場合は、ファイルの読み取りと検証中に同じことを行うことができます。検証が成功するまで少し遅れて、読み取りを再試行し続けます。暴走するリソースの使用を避けるために、遅延が指数関数的なバックオフを形成することは価値があるかもしれません。

于 2015-04-21T14:59:32.787 に答える