0

我需要在 Windows 上唯一标识一个文件,这样即使它被移动或重命名,我也可以始终获得该文件的引用。我做了一些研究,发现问题Unique file identifier in windows with a way that using the Method GetFileInformationByHandle with C++,但显然这只适用于 NTFS 分区,但不适用于 FAT 分区。

我需要编写类似于 DropBox 上的行为:如果您在计算机上关闭它,重命名文件并再次打开它,它会检测到更改并正确同步。我想知道这种技术是什么,如果你们知道的话,DropBox 可能是怎么做的。

例如 FileSystemWatcher 可以工作,但如果使用它的程序已关闭,则无法检测到任何更改。

我将使用 C#。

谢谢,

4

2 回答 2

4

下一个最好的方法(但涉及完全读取每个文件的方法,如果有帮助,我会避免这种方法)是比较文件大小和文件内容的哈希值(例如 SHA-256)。两者发生碰撞的可能性很小,尤其是在正常情况下。

我会在 NTFS 上使用 GetFileInformationByHandle 方式并回退到 FAT 卷上的散列。

不过,在 Dropbox 的情况下,我认为有一个服务或进程在后台运行,观察文件系统的变化。这是最可靠的方法,即使如果您停止所述服务/进程,它也会停止工作。

于 2012-07-21T23:15:07.800 回答
0

用户正在寻找的很可能是 Windows 更改日志。这些跟踪更改,例如持久地重命名文件,无需让观察者一直观察文件系统事件。取而代之的是,只需要维护上次查看日志的时间并从该点开始再次查看。在某些时候,具有已知 ID 的文件将具有类型为 RENAME 的事件,并且对该事件感兴趣的任何人都可以对该文件的自己版本执行相同的操作。当然,重要的是要跟踪文件的使用 ID。

自动备份应用程序是必须检查卷状态更改以执行其任务的程序的一个示例。检查目录或文件更改的暴力方法是扫描整个卷。但是,这通常不是一种可接受的方法,因为它会导致系统性能下降。另一种方法是应用程序为要备份的目录注册一个目录通知(通过调用 FindFirstChangeNotification 或 ReadDirectoryChangesW 函数)。这比第一种方法更有效,但是,它要求应用程序始终运行。此外,如果必须备份大量目录和文件,此类应用程序的处理量和内存开销也可能导致操作系统性能下降。

为避免这些缺点,NTFS 文件系统维护更新序列号 (USN) 更改日志。当对卷中的文件或目录进行任何更改时,该卷的 USN 更改日志会更新,其中包含更改的描述和文件或目录的名称。

https://docs.microsoft.com/en-us/windows/win32/fileio/change-journals

于 2021-07-16T14:57:49.210 回答