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个)。
我的问题:
如果现有文件从现在开始有效,我如何才能/应该继续检查它们?没有丢失的文件干扰。
任何帮助,改进我的功能或指针继续将不胜感激。这里给出的所有代码都可以工作!由于我没有添加任何类型的线程来使它更快,所以在大量文件时它会变慢。
创建一个带有字符串属性FileName和HashValue的实体类MyFileInfo。实现IEqualityComparer,重写Equals和GetHashCode方法。
然后加载健康列表 使用LINQ方法查找列表之间的差异。 看这里LINQ Distinct, Except, Contains, Union, Intersect and IEqualityComparer