Обработка большого файла в потоках - C#

Узнай цену своей работы

Формулировка задачи:

Вот до чего я "дошел" в третьей часу ночи. В рамках самостоятельного изучения криптограифии написал программу, которая вычисляет хэш-функцию файла. Столкнулся с проблемой, что на больших файлах эта программа работает медленно. Я решил использовать потоки (Threads), чтобы обработка и вычисление выполнялись в отдельных потоках. Все равно время работы программы недопустимо велико. Прикрепляю полный код главного класса. Если нужно, предоставлю прочие классы. Прошу прокомментировать код и указать на мои ошибки. Спасибо.
Листинг программы
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Threading;
  5. namespace SHA_256
  6. {
  7. internal class Program
  8. {
  9. private byte[] buf;
  10. private SHA256 sha256;
  11. private uint[] hash;
  12. private static void Main(string[] args)
  13. {
  14. Program program = new Program();
  15. Stopwatch stopWatch = new Stopwatch();
  16. stopWatch.Start();
  17. program.Run();
  18. stopWatch.Stop();
  19. TimeSpan ts = stopWatch.Elapsed;
  20. string elapsedTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}",
  21. ts.Hours, ts.Minutes, ts.Seconds,
  22. ts.Milliseconds / 10);
  23. Console.WriteLine("Время работы: " + elapsedTime);
  24. Console.ReadKey();
  25. }
  26. private FileInfo file;
  27. private FileStream fileStream;
  28. private void Run()
  29. {
  30. string path, s;
  31. sha256 = new SHA256();
  32. Console.WriteLine("Введите путь к файлу:");
  33. //path = Console.ReadLine();
  34. path = @"C:\Users\Alessandro\Downloads\VS2010ExpressRUS.iso";
  35. Console.WriteLine("Введите размер блока:"); // чем больше, тем меньшими "порциями" обрабатывается файл,
  36. // но в итоге время работы программы остается прежним
  37. s = Console.ReadLine();
  38. uint numBlocks = uint.Parse(s);
  39. file = new FileInfo(path);
  40. fileStream = file.Open(FileMode.Open);
  41. long len = fileStream.Length;
  42. long messageLength = len / numBlocks;
  43. for (int i = 0; i < numBlocks; i++)
  44. {
  45. fileStream.Position = i;
  46. buf = new byte[messageLength];
  47. fileStream.Read(buf, 0, buf.Length);
  48. // вычисляем хэш для данного блока:
  49. ComputeHash(buf);
  50. // печатаем блоки:
  51. Console.WriteLine("{0}-й блок: ", i + 1);
  52. Thread th = new Thread(delegate () { PrintBlocks(hash); });
  53. th.Start();
  54. // да еще такой вопрос - надо ли освобождать вручную память
  55. // после использования массива buf[] (он ведь больше не нужен)?
  56. // в C++ я это делал обязательно, а в C# как?
  57. }
  58. fileStream.Close();
  59. }
  60. /// <summary>
  61. /// Вычисляем хэш-функцию SHA256 для заданного блока:
  62. /// и вообще можно ли считать хэш-функцию ДЛЯ БЛОКА(!!!) файла
  63. /// а не для ВСЕГО файла
  64. /// </summary>
  65. /// <param name="message"></param>
  66. /// <param name="size"></param>
  67. private void ComputeHash(byte[] message)
  68. {
  69. hash = sha256.ComputeHash(message);
  70. }
  71. /// <summary>
  72. /// Печатаем блоки:
  73. /// </summary>
  74. private void PrintBlocks(uint[] hash)
  75. {
  76. for (int i = 0; i < hash.Length; i++)
  77. {
  78. Console.Write("{0:X2} ", hash[i]);
  79. }
  80. Console.WriteLine();
  81. Thread.Sleep(0);
  82. }
  83. }
  84. }

Решение задачи: «Обработка большого файла в потоках»

textual
Листинг программы
  1. var hashAlgorithm = SHA256.Create();
  2. hashAlgorithm.ComputeHash(Stream.Null);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы