Получить массив байтов из каталога - PullRequest
0 голосов
/ 14 сентября 2018

Я создаю небольшой инструмент для получения хешей файла или каталога для просмотра контрольных сумм.Прямо сейчас у меня есть отображение хешей одного файла, но когда я пытаюсь получить весь каталог, я получаю ошибку System.UnauthorizedAccessException: 'Access to the path 'D:\dev\hashcheck' is denied.'.

Вот упрощенная версия кода, упрощенная только потому, что он очень повторяющийся.

byte[] fileByte = File.ReadAllBytes(path); //This is where the error is
MD5 md5Hash = MD5.Create();        
Console.WriteLine("The MD5 Hash of the file is; " + 
                  BitConverter.ToString(md5Hash.ComputeHash(fileByte))
                              .Replace("-", string.Empty)
                              .ToLower());

Я попытался добавить <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> в манифест приложения.

Ответы [ 2 ]

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

Согласно документации для ReadAllBytes , первый параметр:

путь. String Файл, который нужно открыть для чтения.

Таким образом, вы должны указать путь к файлу , а не путь к чему-либо еще. Каталог, конечно, не файл, поэтому он не будет работать.

Я не уверен, что вы подразумеваете под "хэшем каталога", но мне кажется, что вам, возможно, придется открыть отдельные файлы (в детерминированном порядке), объединить их байты, а затем запустить алгоритм хеширования для всего этого , т.е. генерировать виртуальный поток байтов, содержащий весь набор файлов.

var virtualByteStream = Directory
    .GetFiles(path)
    .OrderBy( p => p )
    .SelectMany
    (
        p => p.ReadAllbytes()
    );
var hash = md5Hash.ComputeHash(virtualByteStream.ToArray());

Обратите внимание, что этот подход не включает метаданные файла (например, DateModified), поэтому, если это важно для вас, вам нужно будет включить его и любые другие метаданные во входные данные хэша.

(Если ваши файлы большие, вы можете найти способ избежать вызова ToArray() и использовать вместо него ComputeHash(Stream). Но это выходит за рамки этого ответа.)

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

Вам нужно получить все файлы в каталоге, прежде чем вы сможете прочитать содержимое, например:

using System.IO;


        foreach (string file in Directory.GetFiles(path))
        {
            byte[] fileByte = File.ReadAllBytes(file);
            MD5 md5Hash = MD5.Create();        
            Console.WriteLine("The MD5 Hash of the file is; " + 
                  BitConverter.ToString(md5Hash.ComputeHash(fileByte))
                              .Replace("-", string.Empty)
                              .ToLower());        
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...