gpt4 book ai didi

c++ - 跟踪文件名更改

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:00 24 4
gpt4 key购买 nike

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

计划是为已经复制的文件建立某种数据库,这样当程序扫描目录时,它可以挑选出已经复制的内容和需要再次复制的内容,即修改后的文件或新文件。

我不确定如何处理的问题之一是我应该如何处理被用户重命名的文件。我怎么知道重命名的文件实际上与数据库中列出的文件是同一个文件,尽管名称不同。是否有程序可以提取的基础文件 ID?我希望代码是可移植的,这样考虑到文件系统会有所不同,这可能会使这变得更加困难。

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

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

最佳答案

要跟踪给定文件夹中文件的更改在您的应用程序运行时,请参阅QFileSystemWatcher ,您可以在调用 QFileSystemWatcher::addPath 后跟踪目录中的所有文件更改("directory/to/watch/"):

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 兆字节的文件来说可能很慢。如果这个缺点是可以接受的,就把 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com