我正在编写一个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
这样的东西?因为我需要跨平台和结构简单的东西,因为我已经知道我要上传的文件的行为。不幸的是,提升并没有为此提供解决方案,因此我不得不发明自己的解决方案。
答案 0 :(得分:0)
您是否可以访问写作程序?在这种情况下,我建议首先将数据写入临时文件,并在写入完成后重命名(文件系统上的atomic
操作类型)。否则,“等待适当长时间进行更改”方法总是有可能失败,因为您无法确定编写程序长时间不更改文件的原因。
文件甚至可以更改内容而不更改其大小但:
来自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提供了完全打开这些文件的方法,除了你的轮询方法之外还会尝试它。