c++ - 跟踪文件名更改

标签 c++ file qt filesystems rename

我正在尝试编写一个基本的同步程序来在两个目录之间复制文件。

计划是建立某种已复制文件的数据库,以便当程序扫描目录时,它可以找出已复制的内容以及需要再次复制的内容,即修改的文件或新文件。

我不确定如何解决的问题之一是我应该如何处理用户重命名的文件。我如何判断重命名的文件实际上与数据库中列出的文件相同,尽管名称不同。是否有程序可以提取的底层文件 ID?我希望代码是可移植的,因此考虑到文件系统会有所不同,这可能会使这变得更加困难。

我想我可以记下每个文件的大小和创建日期,并将该信息保留在数据库中,以确定该文件是否实际上只是被重命名。如果两个文件具有相同的信息大小/日期,我可以存储散列或其他东西来区分它们,但我不知道这样做的效率如何。

有什么建议吗? (我使用的是 C++/QT)

最佳答案

在应用程序运行时跟踪给定文件夹中文件的更改,请参阅 QFileSystemWatcher ,您可以在调用 QFileSystemWatcher::addPath 后跟踪目录中的所有文件更改(“目录/到/观看/”):

The fileChanged() signal is emitted when a file has been modified, renamed or removed from disk. Similarly, the directoryChanged() signal is emitted when a directory or its contents is modified or removed. Note that QFileSystemWatcher stops monitoring files once they have been renamed or removed from disk, and directories once they have been removed from disk.

为了在文件重命名后继续跟踪文件,只需使用 QFileSystemWatcher::addPath() 重新启用观看它们即可。再次。


当您的应用程序在重命名操作期间未运行时,您必须查看文件的内容(如果您还想涵盖文件已被删除并且复制回来,其中 linux 上的 inode/其他文件系统类型上的任何内容都已更改)。

这可以使用 MD5 和来完成,但它需要您的应用程序读取整个文件,这对于大于 10 MB 的文件来说可能会很慢。如果这个缺点可以接受,只需保存QCryptographicHash::hash返回的MD5和即可。 (file.readAll(), QCryptographicHash::Md5)。当然,在某些极端情况下会出现哈希冲突,但对于大多数应用程序来说这不应该是问题。但请注意,您可能无法检测到内容的更改。另请注意,上面的简单单行代码是阻塞的,它会在计算 MD5 和之前将整个文件读入内存。使用 QCryptographicHash 提供的逐步 MD5 和计算(使用 addData()result() 代替)将文件“流”到MD5计算。

在读取整个内容之前比较文件大小而不是创建 MD5 总和在大多数情况下都有效(更改导致相同文件大小的情况并不常见;在这种情况下,您可以回退到 MD5总和比较)。但是在您注意到更改后,无论如何您都需要读取 MD5 和,以便能够检测 future 的更改!

关于c++ - 跟踪文件名更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11140142/

相关文章:

c++ - 在 C++ 中使用 sizeof 的奇怪行为

file - Mule:JUnit 测试不适用于文件端点

c++ - Qt 忽略 const 说明符

java - 读取和删除文件中的某些行时遇到问题?

Qt 10000 Blade

c++ - Qt 和 OpenGL 如何渲染 PVR

c++ - 如果没有向构造函数提供参数,如何给变量一个默认值? C++

c++ - 是否可以创建一个我们在初始化时不知道元素数量的数组? (处理继承/多态性)

c++ - 将 opencv mat 写入标准输出

java - 无法生成文件 java.io.IOException : No such file or directory