使用更新的输入文件同步程序

时间:2017-12-12 13:31:28

标签: c++ linux stat

我正在使用64位Ubuntu 16.04并在我的代码中尝试将输入文件的任何更新反映到我的程序中。我写了这个似乎有用的测试代码;当我对输入文件进行更改并保存文件时,我通常可以在控制台上看到更新。但有时它会在保存3-5次后更新,即使我多次保存更改也不会更新。我使用了什么错误,可能导致这种行为的原因是什么?有没有更好的方法呢?

#include <iostream>
#include <fstream>
#include <sys/stat.h>

#define INFILE "test.txt"

using namespace std;

__time_t getFileModifyTime(char *filePath)
{
    struct stat attrib;
    stat(filePath, &attrib);
    __time_t date = attrib.st_mtime ;
    return date;
}

int main(){

    ifstream infile;
    infile.open (INFILE);
    string currentLine;

    __time_t lastUpdateTime = 0;    

    while(true)     // start an infinite loop
    {
        if(lastUpdateTime != getFileModifyTime(INFILE)) {

            cout << "last update time  : " << lastUpdateTime << endl;
            cout << "modification time : " << getFileModifyTime(INFILE) << endl;

            infile.close();
            infile.open (INFILE);

            while (getline(infile, currentLine)) {
                cout << currentLine << endl;
            }    
        }
        lastUpdateTime = getFileModifyTime(INFILE);
    }
    // if a miracle happens
    return  0;
}

1 个答案:

答案 0 :(得分:0)

  

我使用的是错误的东西吗,可能是什么原因引起的?

是-您无法检查stat()的返回值。一些流行的编辑器,当您保存文件时,将其重命名为备份名称并编写一个新文件(然后甚至可能删除并看不到备份),因此在{{ 1}}名称不存在,并且INFILE失败,但是仍使用未初始化的stat(),导致行为未定义。对于最小的更改,请打印错误以查看是否发生这种情况,并使attrib.st_mtime定义为attrib

static

也就是说,有时仅在保存3-5次后才更新的原因是另外一个原因:

    static struct stat attrib;
    if (stat(filePath, &attrib) < 0) perror(INFILE);

如果在两个 if(lastUpdateTime != getFileModifyTime(INFILE)) { … } lastUpdateTime = getFileModifyTime(INFILE); 调用之间修改了文件,则更改不会引起注意。为了使更改最小,请将第二个调用移到getFileModifyTime()块的开头:

if
  

有更好的方法吗?

使用inotify肯定会更好。