Conversation
| files.AsParallel() | ||
| .ForAll(file => File.Delete(file.path)); | ||
| Directory.Delete(dirNames[1]); |
There was a problem hiding this comment.
Имело смысл это в try/finally обернуть, или вынести в SetUp/TearDown, иначе при исключении в тестируемом коде тест оставит за собой временные файлы.
| files.AsParallel() | ||
| .ForAll(file => File.WriteAllBytes(file.path, System.Text.Encoding.ASCII.GetBytes(file.data))); | ||
|
|
||
| Assert.That(compute(dirNames[0]), Is.EqualTo(compute(dirNames[0]))); |
There was a problem hiding this comment.
Анализатор ругается, а не должен. Можно было бы переписать этот фрагмент кода, чтобы убрать предупреждение.
| } | ||
|
|
||
| [Test, TestCaseSource(nameof(ComputeInstances))] | ||
| public void FileNameMattersTest(Func<string, byte[]> compute) |
There was a problem hiding this comment.
По условию как раз имя файла в формуле для хеша не участвовало, но ладно, это скорее дефект условия
|
|
||
|
|
||
|
|
| var fileTasks = Directory.GetFiles(path).Select(ComputeFileAsync); | ||
|
|
||
| var dirTasks = Directory.GetDirectories(path).Select(ComputeDirAsync); |
There was a problem hiding this comment.
Directory.GetFiles не фиксирует порядок возвращаемых файлов, так что их сначала надо было отсортировать, иначе значение хеша будет зависеть от непредсказуемых внешних факторов (типа удалили и добавили тот же файл).
|
|
||
| var overallBytes = (await Task.WhenAll(tasks)) | ||
| .SelectMany(byteArray => byteArray) | ||
| .Concat(ComputeString(new DirectoryInfo(path).Name)) |
There was a problem hiding this comment.
По условию от имени директории хеш не считается, она добавляется как есть. Впрочем, это особо не важно, просто лишняя работа.
| return MD5.HashData(byteArray); | ||
| } | ||
|
|
||
| private static byte[] ComputeFile(string path) |
There was a problem hiding this comment.
Однопоточная версия тоже могла бы (да и должна была, по идее) использовать ComputeFileAsync. Асинхронность и многопоточность — разные вещи.
|
|
||
| private static async Task<byte[]> ComputeFileAsync(string path) | ||
| { | ||
| var byteArray = (await MD5.HashDataAsync(new FileInfo(path).OpenRead())).Concat(ComputeString(new FileInfo(path).Name)).ToArray(); |
There was a problem hiding this comment.
Чтобы всё было вообще идеально в плане асинхронности, надо было ещё CancellationToken принимать.
No description provided.