C++:监控文件大小。这可能有问题吗?
Posted
技术标签:
【中文标题】C++:监控文件大小。这可能有问题吗?【英文标题】:C++: Monitor file size. Can this be problematic? 【发布时间】:2015-07-18 08:19:09 【问题描述】:我正在编写一个 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 并没有为此提供解决方案,所以我不得不自己发明。
【问题讨论】:
你的GetFileSize
真的有用吗?我个人会打电话给stat
来获取大小和最后修改时间。
@melpomene 对不起,“实际有效”是什么意思?您的意思是在更新文件大小时有效还是通常适用于任何文件?它适用于没有问题的常规文件。
【参考方案1】:
您可以使用写作程序吗?在这种情况下,我建议先将数据写入临时文件,并且仅在写入完成后重命名(类似于文件系统上的 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 提供了专门打开这些文件的方法,并且除了您的轮询方法之外,我还会尝试它。
【讨论】:
很遗憾,我无法访问写作程序。 文件内容是否有明确定义的语法,例如格式良好的 XML? 为 hd5 改变了一些东西 非常感谢。那么这与文件的前 4 个字节完全一样吗?我必须提取文件的前 2 位?它说它可能有一个偏移量......我发现很难理解如何使用它。 只是说明HD5知道文件访问并发的概念。您应该使用 hd5 库来检查功能以上是关于C++:监控文件大小。这可能有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章