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 &gt; timeout,然后文件没有变化足够长的时间,我可以判断文件是稳定的并且没有被更新。

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

【问题讨论】:

你的GetFileSize 真的有用吗?我个人会打电话给stat 来获取大小和最后修改时间。 @melpomene 对不起,“实际有效”是什么意思?您的意思是在更新文件大小时有效还是通常适用于任何文件?它适用于没有问题的常规文件。 【参考方案1】:

您可以使用写作程序吗?在这种情况下,我建议先将数据写入临时文件,并且仅在写入完成后重命名(类似于文件系统上的 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 提供了专门打开这些文件的方法,并且除了您的轮询方法之外,我还会尝试它。

【讨论】:

很遗憾,我无法访问写作程序。 文件内容是否有明确定义的语法,例如格式良好的 XML? 为 hd5 改变了一些东西 非常感谢。那么这与文件的前 4 个字节完全一样吗?我必须提取文件的前 2 位?它说它可能有一个偏移量......我发现很难理解如何使用它。 只是说明HD5知道文件访问并发的概念。您应该使用 hd5 库来检查功能

以上是关于C++:监控文件大小。这可能有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

GZip 压缩(通过 .net)可以增加文件大小吗?

1.hdfs文件夹大小监控

Android Honeycomb 有文件大小限制吗?

您可以在 C++ 中使用“新”模拟动态数组大小吗?

我可以在 C++ 中定义枚举的大小吗?

检测给定页面使用的外部资源和文件大小