在C#中根据路径查找唯一的文件ID

时间:2016-10-28 15:40:48

标签: c#

我需要一种方法来确定用户是否已将文件复制到新位置。

示例:您有两台计算机,并将file.txt从计算机1上的C:\ Temp \复制到计算机2上的C:\ Temp \。

根据这两个文件的位置,是否有与这两个文件关联的ID,这有助于我确定此文件是否已移动?

更新:经过一番讨论,以下是生成的代码。这通过使用文件路径和创建时间创建Guid来确定是否已复制文件。可以将生成的Guid与存储的Guid进行比较,以确定文件是否已被复制。

FileInfo fi = new FileInfo("C:\\Temp\\temp.txt"); 
string filePathCreationComposite = String.Format("{0}{1}", Path.GetFullPath(fi.FullName), fi.CreationTime); 

using (MD5 md5 = MD5.Create()) 
{ 
   byte[] hash = md5.ComputeHash(Encoding.Default.GetBytes(filePathCreationCo‌​mposite)); 
   Guid result = new Guid(hash); 
}

2 个答案:

答案 0 :(得分:0)

如果您无法控制文件复制的过程(即100%知道用户在您的控制下执行此操作,例如在您的UI中),则唯一可能的检查方法是比较内容。据我所知,没有特别值得信赖的文件ID,特别是在各种机器上,甚至保持不变,以便你可以比较它。

这当然不能保证用户将文件从A复制到B,因为具有完全相同内容的文件可以从其他任何地方复制,但我认为您确实只需要验证该文件中的两个文件两个不同的位置是相同的。

比较文件内容(以及存储它" id")的一种简单方法是计算哈希值。 SHA-256非常适合用于此目的。

这是这样做的例子:

using (FileStream stream = File.OpenRead(file))
{
    SHA256Managed sha = new SHA256Managed();
    byte[] checksum = sha.ComputeHash(stream);
    return BitConverter.ToString(checksum).Replace("-", String.Empty);
}

虽然你不需要一串课程。这不是一种非常有效的方式,您可以阅读更多相关信息herehere。在第一个问题中,他们认为由于某种原因,SHA-512的计算速度更快,不知道它是否正确,这是真的。

P.S。值得注意的是,如果原始文件中有最简单的更改,则哈希值不再匹配。

P.P.S。您可以使用任何更快的哈希,如MD5或其他一些(MD5不具有加密安全性,但这对您的情况无关紧要)。

答案 1 :(得分:0)

您应该可以使用System.IO.FileInfo类检查创建时间或上次写入时间。这与路径信息一起应足以告诉您文件是否已更改或移动。