0

我正在编写一个 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 中)和文件大小被检查的次数,我们称之为checks. 所以每次计时器滴答作响时,我都会寻找新文件,并检查文件的大小是否发生了fileMonitor变化。对于单个文件,如果文件大小与以前不同,那么checks = 1,如果文件大小相同,那么我做checks++

现在在每次迭代中,我都会检查计时器是否在interval*checks > timeout足够长的时间内文件没有更改,我可以判断文件是稳定的并且没有被更新。

显而易见的问题:为什么我不使用类似的东西inotify?因为我需要跨平台且结构简单的东西,因为我已经知道要上传的文件的行为。不幸的是 boost 没有为此提供解决方案,所以我不得不自己发明。

4

1 回答 1

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 提供了专门打开这些文件的方法,并且除了您的轮询方法之外还会尝试它。

于 2015-07-18T08:34:10.797 回答