0

在我们的系统中,当用户上传一个文件时,它被存储在一个独特的文件系统结构中,并生成一个数据库记录。一个文件是通过 Web 浏览器通过 XMLHttpRequest 上传的。然后文件从临时上传区域移动到 FS。

如何检测上传后的文件是否已存在于我的 FS 中?

If the file uploaded is the same as one already uploaded.
If the file is the same file, but the uploaded content has been updated which 
  means I need to update the file in the FS.

我忽略文件名作为了解文件是否已经存在的一种方式。文件名不能被认为是唯一的。一个例子是,一些相机使用在一段时间后滚动的增量编号来命名照片。通过网络浏览器上传文件时,源文件结构被屏蔽。例如C:\Users\Drive\File\Uploaded\From。所以我不能用它来确定文件是否已经上传。

我怎么知道上传的文件已经存在,因为它的内容是一样的。或者它存在但因为上传的文件已更改,所以我可以更新文件?

Microsoft Word 文档带来了挑战,因为 Word 在每次保存时都会重新生成文件。

在用户自行重命名文件的情况下,我可以说运气不好。

4

1 回答 1

1

我将从通过 SHA 哈希查找相同的文件开始。您可以使用类似的方法来获取与新上传文件具有相同哈希值的文件列表,然后采取一些措施。

只是一个获取新文件哈希的例子:

string newfile;
    using(FileStream fs = new FileStream(   string newfile;
    using(FileStream fs = new FileStream("C:\\Users\\Drive\\File\\Uploaded\\From\\newfile.txt", FileMode.Open))
    {
        using (System.Security.Cryptography.SHA1Managed sha1 = new System.Security.Cryptography.SHA1Managed())
        {
            newfile = BitConverter.ToString(sha1.ComputeHash(fs));
        }
    }   

这会遍历所有文件并获取文件名和哈希列表

var allfiles = Directory.GetFiles(@"var allfiles = Directory.GetFiles(@"C:\Users\Drive\File\Uploaded\From\", "*.*")
        .Select(
            f => new
                     {
                         FileName = f,
                         FileHash = new System.Security.Cryptography.SHA1Managed()
                                                            .ComputeHash(new FileStream(f, 
                                                                             FileMode.Open, 
                                                                             FileAccess.Read))
                     })       
        .ToList();

        foreach(var fi in allfiles){
        if(newfile == BitConverter.ToString(fi.FileHash))
            Console.WriteLine("Match!!!");
        Console.WriteLine(fi.FileName + ' ' + BitConverter.ToString(fi.FileHash));
        }

}", " . ") .Select( f => new { FileName = f, FileHash = new System.Security.Cryptography.SHA1Managed() .ComputeHash(new FileStream(f, FileMode.Open, FileAccess.Read)) })
.ToList();

这将遍历它们并寻找与新匹配的匹配项。

        foreach(var fi in allfiles){
        if(newfile == BitConverter.ToString(fi.FileHash))
            Console.WriteLine("Match!!!");
        Console.WriteLine(fi.FileName + ' ' + BitConverter.ToString(fi.FileHash));
        }

理想情况下,您会在文件上传时保存此哈希,因为重新计算非常密集。

于 2013-06-26T00:25:48.577 回答