我正在创建此功能以检查我的所有文件是否仍然正确或是否缺少某些文件。
到目前为止,我已经设法从根目录获取一个包含Files的列表,另一个包含所有哈希值的列表。
我还设法创建一个健康的哈希文本文件。其中包含Hash 3选项卡(因此在记事本中更容易阅读),然后是root文件名。
例如
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, "")));
我必须删除root,因为健康的哈希文件没有来自C:\
的路径因此,您可以看到4个列表,(获得差异后的5个)。
我的问题:
如果现有文件从这一点开始有效,我该如何/应该继续检查?没有丢失的文件干扰。
任何帮助,对我的功能的改进或继续的指示将不胜感激。 注意此处提供的所有代码均有效!使用大量文件会很慢,因为我没有添加任何类型的线程来加快速度。
答案 0 :(得分:1)
使用字符串属性FileName和HashValue创建一个实体类MyFileInfo。实现IEqualityComparer,重写Equals和GetHashCode方法。
然后加载健康列表&lt; MyFileInfo&GT;从文件和构建到检查列表&lt; MyFileInfo&GT;从当前目录。
使用LINQ方法查找列表之间的差异。
看这里 LINQ Distinct, Except, Contains, Union, Intersect and IEqualityComparer