无论移动,重命名和内容修改如何,都有办法在文件的生命周期内唯一标识文件(可能还有目录)吗? (Windows 2000及更高版本) . 制作文件的副本应该为副本提供它自己的唯一标识符 .
我的应用程序将各种元数据与单个文件相关联 . 如果修改,重命名或移动文件,则能够自动检测和更新文件关联将非常有用 .
FileSystemWatcher可以提供通知这些更改的事件,但是如果快速发生许多文件系统事件,它会使用可以轻松填充(和事件丢失)的内存缓冲区 .
哈希是没有用的,因为文件的内容可以改变,因此哈希值会改变 .
我曾想过使用文件创建日期,但是有一些情况下这不是唯一的(即复制多个文件时) .
我也听说过NTFS中的文件SID(安全ID?),但我不确定这是否能满足我的要求 .
有任何想法吗?
4 回答
如果您调用GetFileInformationByHandle,您将获得BY_HANDLE_FILE_INFORMATION.nFileIndexHigh / Low中的文件ID . 该索引在卷中是唯一的,即使您移动文件(在卷内)或重命名它也保持不变 .
如果您可以假设使用了NTFS,则可能还需要考虑使用备用数据流来存储元数据 .
这是返回唯一文件索引的示例代码 .
ApproachA()是经过一番研究后得出的 . ApproachB()归功于Mattias和Rubens提供的链接中的信息 . 给定一个特定文件,两种方法都返回相同的文件索引(在我的基本测试期间) .
来自MSDN的一些警告:
上面的第一个粗体评论让我担心 . 目前尚不清楚该声明是否仅适用于FAT,它似乎与第二个粗体文本相矛盾 . 我想进一步测试是确保的唯一方法 .
[更新:在我的测试中,当文件从一个内部NTFS硬盘驱动器移动到另一个内部NTFS硬盘驱动器时,文件索引/ ID会发生变化 .
请看这里:Unique file ids for Windows . 这也很有用:Unique ID for files on NTFS?
用户还提到了唯一的目录标识 . 这个过程比检索文件的唯一信息更复杂;但是,这是可能的 . 它要求你调用一个特定的标志
CREATE_FILE
function . 使用该句柄,您可以在Ash的answer中调用GetFileInformationByHandle
函数 .这也需要
kernel32.dll
导入:稍后我会更多地充实这个答案 . 但是,通过上述相关答案,这应该开始有意义了 . 我最喜欢的资源是pinvoke,它帮助我了解.Net C#签名的可能性 .