Я создаю эту функцию, чтобы проверить, все ли мои файлы по-прежнему правильны или нет, некоторые файлы отсутствуют.
Пока мне удалось получить список с файлами из корневого каталога и еще один список со всеми его хешами.
Мне также удалось создать здоровый текстовый файл хэша. которая содержит вкладки 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, "")));
Я должен удалить корень здесь, так как здоровый хэш-файл не имеет пути от C: \
Итак, как вы можете видеть 4 списка, (хорошо 5 после получения различий).
Мой вопрос:
Как я могу / должен продолжать проверять существующие файлы, если они действительны с этого момента? без вмешательства отсутствующих файлов.
Буду признателен за любую помощь, улучшение моих функций или указатели для продолжения.
ПРИМЕЧАНИЕ Весь приведенный здесь код работает! Будь он медленным с большим количеством файлов, так как я не добавил никакого вида потоков, чтобы сделать его быстрее.