在Windows上唯一标识文件

时间:2012-07-21 23:09:52

标签: c# winapi dropbox ntfs

我需要在Windows上唯一标识一个文件,这样我就可以随时获得该文件的引用,即使它被移动或重命名。我做了一些研究,发现问题Unique file identifier in windows的方法使用方法GetFileInformationByHandle和C ++,但显然只适用于NTFS分区,但不适用于FAT分区。

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

例如,

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

我将使用C#。

谢谢,

2 个答案:

答案 0 :(得分:4)

下一个最好的方法(但是涉及完全读取每个文件的方法,在可以帮助时我会避免)将比较文件大小和文件内容的散列(例如SHA-256)。碰撞的可能性相当小,特别是在正常情况下。

我在NTFS上使用GetFileInformationByHandle方法,然后回退到FAT卷上的散列。

在Dropbox的情况下,我认为,在后台观察文件系统更改时会运行一个服务或进程。这是最可靠的方式,即使停止服务/流程也不会起作用。

答案 1 :(得分:0)

用户查找的内容很可能是 Windows 更改日志。那些持续跟踪文件重命名等更改,无需让观察者一直观察文件系统事件。相反,人们只需要保持上次查看日志的时间并从该点开始再次查看。在某些时候,具有已知 ID 的文件将具有 RENAME 类型的事件,并且对该事件感兴趣的任何人都可以对其自己的该文件版本执行相同的操作。当然,重要的是跟踪文件使用的 ID。

<块引用>

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

<块引用>

为了避免这些缺点,NTFS 文件系统维护更新序列号 (USN) 更改日志。当卷中的文件或目录发生任何更改时,该卷的 USN 更改日志将更新为更改说明以及文件或目录的名称。

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