0

我正在尝试监视一个目录并通知文件更改(创建),我在 Windows 7 和 Ubuntu 12.04 上使用虚拟机(VirtualBox)作为来宾,当一个文件添加到我的监视文件夹时我测试存在获取它的大小并稍后对其进行操作,问题是:有时它返回 0 作为大小,尽管文件存在并且大小不为零,这是我的代码:

void Watcher::OnFileChanged (char* FileBaseName)
{

    QDir watchDir(RootToWatch);
    QString fileN="";
    fileN=QString::fromLocal8Bit(FileBaseName);
    QFileInfo file(RootToWatch+"/"+fileN);
    qDebug()<<"Watcher::OnFileChanged "<<fileN;

    try
       {
       if(file.exists())
       {
           qDebug()<<"FileWatcher::OnFileChanged "<<fileN<<"exists";
           qDebug()<<"OnFileChanged:fileName "<<file.fileName()
                   <<"\nOnFileChanged File().size"<<QFile(fileN).size()
                   <<"\nOnFileChanged QFileInfo Size:"<<file.size();
 ....
       }
       }
}

我应该等待一段时间才能获得实际大小(如果是的话,如何匹配以及如何测试文件是否准备好读取)还是我错过了一些东西。

任何帮助将不胜感激。

4

1 回答 1

3

这听起来确实像是“在文件最终写入之前观察者关闭”的典型案例——这确实是完全可以预料的行为,因为你只能说“告诉我这个文件是否已经改变”——大小为零绝对是change - 无论是以前存在还是刚刚存在,它都是对先前状态的更改。

在这种情况下,我的方法是再次设置手表,并查看文件下次是否“增长”。

于 2013-01-28T09:47:57.637 回答