Как сделать контрольную сумму для всего USB-накопителя? - PullRequest
0 голосов
/ 06 сентября 2018

Мне нужно создать контрольную сумму для всего USB-накопителя. Я хочу иметь возможность получить контрольную сумму для всего USB-накопителя, когда я помещаю на него файлы, а затем получить другую контрольную сумму, чтобы проверить, что ничего не изменилось (вирусы, обновления файлов и т. Д.).

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

private string ChecksumFolder(string path)
{
    string[] files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);

    StringBuilder allChecksum = new StringBuilder();

    for (int count = 0; count < files.Length; count++)
    {
        allChecksum.Append(CreateChecksumFromFile(files[count]));
    }

    return CreateChecksumFromString(allChecksum.ToString());
}

У меня проблемы с папкой «System Volume Information», которая вызывает исключение в строке Directory.GetFiles(). Контрольная сумма для файлов и StringBuilder прекрасно работает при использовании в других папках.

Вам известен какой-либо другой способ создания контрольной суммы для всего USB или способ программного доступа в эту папку System Volume Information?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Добавление CreateChecksumFromFile (версия String, по сути, такая же, просто с использованием другого типа потока для контрольной суммы)

private string CreateChecksumFromFile(string file)
{
    string mChecksum;
    using (FileStream stream = File.OpenRead(file))
    {
        SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
        byte[] checksum = sha.ComputeHash(stream);
        mChecksum = BitConverter.ToString(checksum).Replace("-", String.Empty);
        sha.Clear();
    }
    return mChecksum;
}

1 Ответ

0 голосов
/ 06 сентября 2018

ОК, так что у вас проблема с двумя частями.

  1. Вы хотите просмотреть все файлы в каталоге и создать контрольную сумму.
  2. Там могут быть некоторые недоступные файлы, но вы хотите, чтобы вы также включили их в контрольную сумму.

Итак, я предлагаю своего рода обходное решение. - Если файл доступен, создайте для него контрольную сумму. - Если нет, добавьте имя файла в список. - Позже, проверяя целостность, мы проверяем и контрольную сумму, и список недоступных файлов.

Итак, предположим, что следующий метод использует пример в этом ответе SO и создает список доступных файлов. Но, кроме того, в случае, если файл недоступен, он добавляет его в список.

private static void FindFiles(string path, string file_pattern, bool recurse, out List<string> accessible, out List<string> inaccessible)
{
    accessible = new List<string>();
    inaccessible = new List<string>();
    // This creates two lists, one with accessible files and one with inaccessible files.
}

Теперь давайте изменим ваши методы.

private string ChecksumFolder(string path, out List<string> inaccessibleFiles)
{
    inaccessibleFiles = null;

    FindFiles(path, "*", true, out List<string> accessible, out List<string> inaccessible);
    inaccessibleFiles = inaccessible;

    StringBuilder allChecksum = new StringBuilder();

    for (int count = 0; count < accessible.Count; count++)
    {
        allChecksum.Append(CreateChecksumFromFile(accessible[count]));
    }

    return CreateChecksumFromString(allChecksum.ToString());
}

Теперь у вас есть контрольная сумма для этой папки с использованием всех доступных файлов и список недоступных файлов. Вы сохраняете оба и отправляете их в любое приложение, которое позже будет проверять целостность. И с этой стороны вы сопоставляете контрольную сумму, а также проверяете, совпадают ли файлы в списке недоступных файлов.

...