文件重复搜索保存

时间:2011-05-02 06:55:34

标签: c# .net asp.net

我正在使用一个C#ASP.NET应用程序,我有文件夹名称xyz,在这个文件夹中,一些文件以jpg,doc等存储,并以其特定名称存储。

但是当我添加一个已存在于此文件夹中但以不同名称保存的文件时。

我想问一下如何找到名称不同但实际上相同的文件?

3 个答案:

答案 0 :(得分:3)

您的问题很难理解,但我认为您正在询问如何识别重复文件:具有相同内容的不同文件。

这样做的一种方法是散列每个文件的内容(使用散列函数,如SHA-1)并将结果存储在Dictionary中,使用散列作为键,以及{{{ 1}}文件名作为值。如果两个(或更多)文件具有相同的内容,它们将具有相同的哈希值,因此它们将全部归入字典中的相同密钥。在对所有文件进行哈希处理并将结果放入字典后,您可以查看其值并检查是否有任何列表包含多个项目。

答案 1 :(得分:2)

void SaveFile(string fileName)
{
    string folderPath = Server.MapPath("~/xyz");
    DirectoryInfo dirInfo = new DirectoryInfo(folderPath);

    FileInfo fileInfo = new FileInfo(fileName);

    // comparison algorithm based on size and creation date
    bool exists = (from fi in dirInfo.EnumerateFiles(folderPath)
                   where fi.Size == fileInfo.Size &&
                         fi.CreationTimeUtc == fileInfo.CreationTimeUtc
                   select fi).Any();

    // comparison algorithm based on hash
    string fileHash = ComputeHash(fileInfo.FullPath);   
    bool exists = (from fi in dirInfo.EnumerateFiles(folderPath)
                   where String.Equals(
                       ComputeHash(fi.FullPath),
                       fileHash,
                       StringComparison.Ordinal)
                   select fi).Any();                       
}

示例如何获取文件的md5哈希值see more

string ComputeHash(string fileName)
{
    byte[] bytes;
    using (Stream stream = new FileStream(fileName, FileMode.Open))
    {
        MD5 md5 = new MD5CryptoServiceProvider();
        bytes = md5.ComputeHash(stream);
    }

    StringBuilder sb = new StringBuilder(retVal.Length);
    for (int i = 0; i < bytes.Length; i++)
    {
        sb.Append(bytes[i].ToString("x2"));
    }
    return sb.ToString();
}

答案 2 :(得分:0)

如果我正确理解了这个问题,你想知道2个文件是同一个文件,即使它们有不同的文件名。

我想您可以逐字节读取每个文件并进行比较:

public static bool AreEqual(string f1, string f2)
{
    var fi1 = new FileInfo(f1);
    var fi2 = new FileInfo(f2);

    // first check that they are the same size, obviously a pre-req for them being equal 
    if (f1.Length != f2.Length)
    {
        return false;
    }

    var sr1 = new FileStream(f1, FileMode.Open);
    var sr2 = new FileStream(f2, FileMode.Open);

    for (int i = 0; i < f1.Length; i++)
    {
        byte[] left = new byte[1];
        byte[] right = new byte[1];
        sr1.Read(left, i, 1);
        sr2.Read(right, i, 1);
        if (left[0] != right[0])
        {
            return false;
        }
    }
    return true;
}