Функция контрольной суммы файла c # - PullRequest
4 голосов
/ 07 октября 2011

Я создаю эту функцию, чтобы проверить, все ли мои файлы по-прежнему правильны или нет, некоторые файлы отсутствуют.

Пока мне удалось получить список с файлами из корневого каталога и еще один список со всеми его хешами.

Мне также удалось создать здоровый текстовый файл хэша. которая содержит вкладки 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 после получения различий).

Мой вопрос:

Как я могу / должен продолжать проверять существующие файлы, если они действительны с этого момента? без вмешательства отсутствующих файлов.

Буду признателен за любую помощь, улучшение моих функций или указатели для продолжения. ПРИМЕЧАНИЕ Весь приведенный здесь код работает! Будь он медленным с большим количеством файлов, так как я не добавил никакого вида потоков, чтобы сделать его быстрее.

1 Ответ

1 голос
/ 10 октября 2011

Создать класс сущности MyFileInfo со строковыми свойствами FileName и HashValue. Реализуйте IEqualityComparer, переопределите методы Equals и GetHashCode.

Затем загрузите исправный список из файла и создайте список проверки из текущего каталога.

Используйте методы LINQ, чтобы найти различия между списками.

Смотри здесь LINQ Отличительный, кроме, содержит, объединяет, пересекает и IEqualityComparer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...