c#文件校验和函数

本文关键字:函数 校验和 文件 | 更新日期: 2023-09-27 18:10:36

我创建这个函数是为了检查我所有的文件是否仍然正确,或者是否有一些文件丢失。

到目前为止,我已经设法从根目录中获得了一个包含文件的列表,以及另一个包含所有哈希值的列表。

我还设法创建了一个健康的哈希文本文件。其中包含哈希3选项卡(因此在记事本中更容易阅读),然后是根目录的文件名。

3914ea0985f3f67a8204685beb6d1be6            'file1.extension
2ed432f68ab6ebfc32664409482f0de2            'folder1'file2.extension

每个都在一个单独的列表中结束,所以现在我有4个列表。

我想知道我是否应该使用字典,而不是将4个列表减少到2个字典。

因此文件名(加上任何子目录)将是键,值将是哈希值。

KEY                                 VALUE
'file1.extension                    3914ea0985f3f67a8204685beb6d1be6
'folder1'file2.extension            2ed432f68ab6ebfc32664409482f0de2

我的假设是,通过这样做,我可以检查丢失的文件,并从具有健康散列的字典中删除这些键。这样我就可以平等地检查现有的文件。(仅基于索引)

下面是我当前的代码,以获得所需的东西。

获取文件列表:

    public List<string> Get_FileList(string root)
    {
        List<string> FileList = Directory.GetFiles(root, "*.*", SearchOption.AllDirectories).Where(name => 
        { 
            return
                !(name.EndsWith("dmp") || name.EndsWith("jpg") ||                               //exclude dmp and image files
                name.EndsWith("FileChecker.exe"));                                             //exclude myself
        }).ToList();
        return FileList;
    }

获取哈希值:

    public List<string> Get_FileHash(List<string> FileList)
    {
        List<string> FileHash = new List<string>();
        foreach (string FileName in FileList)
        {
            FileStream file = new FileStream(FileName, FileMode.Open, FileAccess.Read);
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] retVal = md5.ComputeHash(file);
            file.Close();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < retVal.Length; i++)
            {
                sb.Append(retVal[i].ToString("x2"));
            }
            FileHash.Add(sb.ToString());
        }
        return FileHash;
    }

获取健康散列:

public void Get_HealthyHash(string file, out List<string> Healthy_FileList, out List<string> Healthy_HashList) 
    {
        string resource= "FileCheckSum.Resources." + file;
        Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource);
        StreamReader reader = new StreamReader(stream);
        Healthy_FileList = new List<string>();
        Healthy_HashList = new List<string>();
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            string[] items = line.Split(new string[] { "'t't't" }, StringSplitOptions.RemoveEmptyEntries);
            Healthy_FileList.Add(items[1]);
            Healthy_HashList.Add(items[0]);
        }
    }

和确定丢失的文件,我使用这个:

IEnumerable<string> Dif_File_list = Healthy_FileList.Except(FileList.Select(name => name.Replace(root, "")));

我必须删除这里的根,因为健康的哈希文件没有路径从C:'

因此,您可以看到4个列表,(在得到差异之后是5个)。

我的问题:

如果现有文件从现在开始有效,我如何才能/应该继续检查它们?没有丢失的文件干扰。

任何帮助,改进我的功能或指针继续将不胜感激。这里给出的所有代码都可以工作!由于我没有添加任何类型的线程来使它更快,所以在大量文件时它会变慢。

c#文件校验和函数

创建一个带有字符串属性FileName和HashValue的实体类MyFileInfo。实现IEqualityComparer,重写Equals和GetHashCode方法。

然后加载健康列表从文件和构建到检查列表<</p>

使用LINQ方法查找列表之间的差异。

看这里LINQ Distinct, Except, Contains, Union, Intersect and IEqualityComparer