У меня есть каталог, содержащий множество файлов (около 650 файлов), и я хочу получить все файлы, присутствующие в этом каталоге, с их хешем (что-то вроде sha256 или sha512) в словаре, видя при этом процент операции? Потому что я предполагаю, что их хеширование займет некоторое время.
Да, их размеры варьируются от 1Кб до 50Мб.
Возможно, вы захотите попробовать этот подход; Основываясь на аналогичных случаях, он показал многообещающие результаты и потенциально может решить проблему, с которой вы столкнулись.
public static async Task<Dictionary<string, string>> GetFilesAndHashesAsync(string pathToDirectory, IProgress<double>? progress = null)
{
var filesDictionary = new Dictionary<string, string>();
using (var sha = SHA256.Create())
{
if (!Directory.Exists(pathToDirectory))
{
throw new DirectoryNotFoundException($"Directory not found: {pathToDirectory}");
}
var files = Directory.EnumerateFiles(pathToDirectory).ToArray();
var totalFiles = files.Length;
double processedFiles = 0;
foreach (var file in files)
{
using (var fileStream = File.OpenRead(file))
{
var hashBytes = await sha.ComputeHashAsync(fileStream);
var hashString = BitConverter.ToString(hashBytes).Replace("-", string.Empty);
filesDictionary.Add(Path.GetFileName(file), hashString);
}
processedFiles++;
progress?.Report(processedFiles / totalFiles * 100);
}
}
return filesDictionary;
}
Вы также можете использовать GetFiles
против EnumerateFiles.ToArray
Вместо BitConverter
и Replace
можно использовать Convert.ToHexString
. И зачем использовать Dictionary<string, string>
, а не Dictionary<string, byte[]>
с помощью специального компаратора EqualityComparer<byte[]>.Create((a, b) => a.SequenceEqual(b), a => new HashCode().AddBytes(a).ToHashCode())
Благодарим вас за вклад в сообщество Stack Overflow. Возможно, это правильный ответ, но было бы очень полезно предоставить дополнительные пояснения к вашему коду, чтобы разработчики могли понять ваши рассуждения. Это особенно полезно для новых разработчиков, которые не так хорошо знакомы с синтаксисом или пытаются понять концепции. Не могли бы вы отредактировать свой ответ, включив в него дополнительную информацию на благо сообщества?
Я полагаю, вы хотите хешировать содержимое файлов, а не только их имена, верно?