监控文件大小.这会有问题吗?
C++: Monitor file size. Can this be problematic?
我正在编写一个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没有提供解决方案,所以我不得不自己发明一个。
你可以使用写作程序吗?在这种情况下,我建议首先将数据写入临时文件,并在写入完成后重新命名它(类似于文件系统上的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提供了专有的打开这些文件的方法,并将尝试它除了您的轮询方法。
- 我似乎对if/else的基本语句有问题:/
- 我在范围内未声明的错误类有问题
- 读取某些文件时出现分段错误,似乎与文件大小无关
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 构建挂起,即使是适度的文件大小
- 如何在Windows内核中获取文件大小
- 我的C++语言蛮力算法有问题
- 我关于函数"Assert"的C++代码有问题
- 使用 fstream 库并在屏幕上打印的文件有问题?
- 我的C++程序有问题.涉及动态调整整数数组的大小
- 我的C++程序中的文件输入有问题
- 它说头文件有问题,mmsystem.h,我不能使用PlaySound()
- qt5设计器,使用fileopen,在lineedit中显示文件路径,这样做是否有问题
- 从一个目录中读取许多小文件是多么有问题
- 我的.h文件有问题
- 监控文件大小.这会有问题吗?
- 生成的 TeX 文件中存在有问题的"\\+"序列
- 同一文件上的 seekp()、seekg()、read() 和 write() 有问题
- 在头文件外部定义此函数是否有问题?(Visual Studio 2015,C++)