C ++:监控文件大小。这可能有问题吗?

时间:2015-07-18 08:19:09

标签: c++ timer monitor filesize stability

我正在编写一个GUI程序,用于将文件夹中的文件与服务器同步。我所知道的关于这些文件的信息是它们总是被写入而不是被删除。我担心的是在文件被写入时开始上传文件。所以为了避免这种情况,我发明了一种解决问题的方法,我需要一些专家告诉我这是不是错了。

所以我做的是我有一个带定时器的事件循环。每次此计时器滴答时,它会查看是否添加了新文件。如果找到新文件,我使用这个简单的函数来获取文件大小:

std::size_t GetFileSize(const std::string &filename)
{
    std::ifstream file(filename.c_str(), std::ios::binary | std::ios::ate);
    return file.tellg();
}

然后,我将新文件的名称,大小存储在表单的数据结构中(忽略std::以使其在视觉上友好,因为在下一行中有5个写入):

deque<pair<string, pair<size_t, long> > fileMonitor;

(如果可能,请建议更好的数据结构。unordered_multimap似乎做了类似的工作)。

因此,这将存储文件名(在该字符串中),其大小(在该size_t中)以及未经更改检查文件大小的次数,让我们调用它{{1} }。因此,每次计时器滴答时,我会查找新文件,并检查checks中文件的大小是否已更改。对于单个文件,如果文件大小与之前不同,那么fileMonitor,如果文件大小相同,那么我会checks = 1

现在在每次迭代中,我检查计时器是否checks++,然后文件没有长时间改变,我可以判断文件是否稳定而不是正在更新。

明显的问题:为什么我不使用像interval*checks > timeout这样的东西?因为我需要跨平台和结构简单的东西,因为我已经知道我要上传的文件的行为。不幸的是,提升并没有为此提供解决方案,因此我不得不发明自己的解决方案。

1 个答案:

答案 0 :(得分:0)

您是否可以访问写作程序?在这种情况下,我建议首先将数据写入临时文件,并在写入完成后重命名(文件系统上的atomic操作类型)。否则,“等待适当长时间进行更改”方法总是有可能失败,因为您无法确定编写程序长时间不更改文件的原因。

  • HD5格式的附加功能

文件甚至可以更改内容而不更改其大小

来自https://www.hdfgroup.org/HDF5/doc/H5.format.html#FileMetaData

  

文件一致性标志

     

此值包含用于指示有关的信息的标志   文件中包含的信息的一致性。目前,   定义了以下位标志:

Bit 0 set indicates that the file is opened for write-access.
Bit 1 set indicates that the file has been verified for consistency and is guaranteed to be consistent with the format defined
     

在本文件中。       位2-31保留供将来使用。

     

应该将位0设置为打开文件时的第一个操作   写入访问权限,应该仅作为最终操作时清除   关闭文件。在正常访问文件期间,应清除位1   并且只有在库保证文件的一致性之后才能设置   或一致性实用程序。

我认为hd5 API提供了完全打开这些文件的方法,除了你的轮询方法之外还会尝试它。