如何检查输入文件是否已更新?

时间:2017-12-08 00:48:03

标签: c++ linux

我正在读一个大约40000行的~2mb CSV文件,每行定义一个列表中的对象,我需要将输入文件的任何更改反映到我的列表中,反之亦然......如果我修改了一个输入文件中的行我需要更新列表中的对象,对对象的修改将立即反映到文件中。 我知道它可以在无限循环中完成,但它相当浪费资源和听起来很荒谬。是否有一个函数或更新标志,我可以检查或其他方法,我只在更新时读取文件? 我顺便用C ++编写代码:)

EDITED

我用@Jake提出的代码玩了一段时间,然后提出了一个有效的解决方案。这是一个更好的问题然后...我写的代码似乎有时立即工作,但有时它不会更新我对文件的修改,因为我保存文件,只有在保存文件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);
    }

    return  0;
}

1 个答案:

答案 0 :(得分:2)

使用Linux,您可以使用以下代码判断文件是否已更新:

auto getFileCreationTime(char *filePath)
{
    struct stat attrib;
    stat(filePath, &attrib);
    char date[10];
    strftime(date, 10, "%d-%m-%y", gmtime(&(attrib.st_ctime)));
    return date;
}

所以使用线程和while语句你可以做这样的事情

auto mod_time_first = getLastTime();
while(true)
{
    if(mod_time_first == getLastTime()) {} // Do something now
    mod_time_first = getLastTime();
}