C# 在Windows上唯一标识文件

C# 在Windows上唯一标识文件,c#,winapi,dropbox,ntfs,C#,Winapi,Dropbox,Ntfs,我需要在Windows上唯一标识一个文件,这样即使该文件被移动或重命名,我也可以始终拥有该文件的引用。我做了一些研究,发现了一个问题,用的方法GetFileInformationByHandle与C++,但显然只适用于NTFS分区,但不为胖的。 我需要编写一个类似DropBox上的行为:如果在计算机上关闭它,重命名一个文件并再次打开它,它会检测到更改并正确同步。我想知道这是什么技术,如果你们知道的话,DropBox是怎么做的 例如,FileSystemWatcher可以工作,但如果使用它的程序关

我需要在Windows上唯一标识一个文件,这样即使该文件被移动或重命名,我也可以始终拥有该文件的引用。我做了一些研究,发现了一个问题,用的方法GetFileInformationByHandle与C++,但显然只适用于NTFS分区,但不为胖的。 我需要编写一个类似DropBox上的行为:如果在计算机上关闭它,重命名一个文件并再次打开它,它会检测到更改并正确同步。我想知道这是什么技术,如果你们知道的话,DropBox是怎么做的

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

我将使用C

谢谢,

下一个最好的方法是比较文件大小和文件内容的散列值(例如SHA-256),这是一种需要完全读取每个文件的方法,如果有帮助的话,我会避免这种方法。两者碰撞的可能性相当小,特别是在正常情况下

我会在NTFS上使用GetFileInformationByHandle方式,然后在FAT卷上使用哈希

在Dropbox的例子中,我认为有一个服务或进程在后台运行,观察文件系统的变化。这是最可靠的方法,即使停止了上述服务/流程,它也会停止工作。

下一个最好的方法(但需要完全读取每个文件,如果有帮助,我会避免这样做)是比较文件大小和文件内容的散列(例如SHA-256)。两者碰撞的可能性相当小,特别是在正常情况下

我会在NTFS上使用GetFileInformationByHandle方式,然后在FAT卷上使用哈希


在Dropbox的例子中,我认为有一个服务或进程在后台运行,观察文件系统的变化。这是最可靠的方法,即使停止了上述服务/流程,它也会停止工作。

为什么不散列文件数据并比较散列?数据在此期间可能会发生变化。如果数据发生变化,您甚至会如何开始尝试检测它们是同一个文件?我仍然不明白:如果文件的名称和内容发生了变化,为什么你会认为它和以前一样?不一样,但是我需要在它存在的时候跟踪它。我需要知道文件存在时是什么,即使它已被重命名、移动或更改了内容。为什么不散列文件数据并比较散列?数据在此期间可能会更改。如果数据更改,您如何开始尝试检测它们是同一个文件?我仍然不知道:如果文件更改了名称,和它的内容,为什么你会认为它和以前一样?不一样,但是我需要在它存在的时候跟踪它。我需要知道文件存在时是什么,即使它已被重命名、移动或更改了内容。