gpt4 book ai didi

c# 文件校验和函数

转载 作者:行者123 更新时间:2023-11-30 12:51:06 24 4
gpt4 key购买 nike

我正在创建此函数来检查我的所有文件是否仍然正确或是否缺少某些文件。

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

我还设法创建了一个健康的散列文本文件。其中包含 Hash 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 个)。

我的问题:

我如何/应该继续检查现有文件是否从此时开始有效?没有丢失的文件干扰。

任何帮助,对我的功能的改进或继续的指示将不胜感激。注意 这里给出的所有代码都有效!大量文件会很慢,因为我没有添加任何类型的线程来使其更快。

最佳答案

使用字符串属性 FileName 和 HashValue 创建一个实体类 MyFileInfo。实现 IEqualityComparer,覆盖 Equals 和 GetHashCode 方法。

然后从文件中加载健康的 List 并从当前目录构建到 Examine List

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

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

关于c# 文件校验和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com