特定のファイルで新しいデータがいつ利用可能になるかを知る必要がある QT アプリがあります。そこで、信号を使用して、変更があった場合にメッセージを送信する関数にQFileSystemWatcher
接続しました。fileChanged
問題は、fileChanged
別のアプリケーションがこのファイルをフラッシュしたときにシグナルが送信されず、ファイルが閉じられた後にのみ送信されることです。
ただし、QFileSystemWatcher のドキュメントには、このシグナルは「指定されたパスにあるファイルが変更、名前変更、またはディスクから削除されたときに」発行されると記載されています。多分私は何かが欠けています。にはどのような変更が含まれていmodified
ますか? フラッシュが含まれていない場合、新しいデータがファイルに書き込まれたことをどのように検出できますか?
ソースコードは次のとおりです。
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
メインウィンドウ.h
#include <QFileSystemWatcher>
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void fileChangedEvent(const QString & path);
private:
QFileSystemWatcher * watcher;
};
メインウィンドウ.cpp
#include "mainwindow.h"
MainWindow::MainWindow()
{
watcher = new QFileSystemWatcher();
connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChangedEvent(QString)));
watcher->addPath("path to file");
}
void MainWindow::fileChangedEvent(const QString & path)
{
qDebug() << path;
}
MainWindow::~MainWindow()
{
if(watcher!=NULL)
{
delete watcher;
watcher=NULL;
}
}
これは、ファイルを変更する別のアプリケーションのコードです (これはサードパーティのアプリなので、同期するように変更することはできません)。
#include <fstream>
int main () {
std::ofstream outfile ("path to file");
for (int n=0; n<100; ++n)
{
outfile << n;
outfile.flush();
}
outfile.close();
return 0;
}
fileChanged()
シグナルは後にのみ発行され、呼び出されますが、後ではありませstd::ofstream outfile ("path to file");
んoutfile.close();
outfile.flush();