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

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

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

Вот до чего я "дошел" в третьей часу ночи. В рамках самостоятельного изучения криптограифии написал программу, которая вычисляет хэш-функцию файла. Столкнулся с проблемой, что на больших файлах эта программа работает медленно. Я решил использовать потоки (Threads), чтобы обработка и вычисление выполнялись в отдельных потоках. Все равно время работы программы недопустимо велико. Прикрепляю полный код главного класса. Если нужно, предоставлю прочие классы. Прошу прокомментировать код и указать на мои ошибки. Спасибо.
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
 
namespace SHA_256
{
    internal class Program
    {
        private byte[] buf;
        private SHA256 sha256;
        private uint[] hash;
 
        private static void Main(string[] args)
        {
            Program program = new Program();
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            program.Run();
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            Console.WriteLine("Время работы:  " + elapsedTime);
            Console.ReadKey();
        }
 
        private FileInfo file;
        private FileStream fileStream;
        
        private void Run()
        {
            string path, s;
            sha256 = new SHA256();
 
            Console.WriteLine("Введите путь к файлу:");
            //path = Console.ReadLine();
            path = @"C:\Users\Alessandro\Downloads\VS2010ExpressRUS.iso";
 
            Console.WriteLine("Введите размер блока:"); // чем больше, тем меньшими "порциями" обрабатывается файл,
                                                        // но в итоге время работы программы остается прежним
            s = Console.ReadLine();
            uint numBlocks = uint.Parse(s);
 
            file = new FileInfo(path);
            fileStream = file.Open(FileMode.Open);
 
            long len = fileStream.Length;
            long messageLength = len / numBlocks;
            
            for (int i = 0; i < numBlocks; i++)
            {
                fileStream.Position = i;
                buf = new byte[messageLength];
                fileStream.Read(buf, 0, buf.Length);
                // вычисляем хэш для данного блока:
                ComputeHash(buf);
                // печатаем блоки:
                Console.WriteLine("{0}-й блок: ", i + 1);
                Thread th = new Thread(delegate () { PrintBlocks(hash); });
                th.Start();
 
                // да еще такой вопрос - надо ли освобождать вручную память
                // после использования массива buf[] (он ведь больше не нужен)?
                // в C++ я это делал обязательно, а в C# как?
            }
            fileStream.Close();
        }
 
        /// <summary>
        /// Вычисляем хэш-функцию SHA256 для заданного блока:
        /// и вообще можно ли считать хэш-функцию ДЛЯ БЛОКА(!!!) файла
        /// а не для ВСЕГО файла
        /// </summary>
        /// <param name="message"></param>
        /// <param name="size"></param>
        private void ComputeHash(byte[] message)
        {
            hash = sha256.ComputeHash(message);
        }
 
        /// <summary>
        /// Печатаем блоки:
        /// </summary>
        private void PrintBlocks(uint[] hash)
        {
            for (int i = 0; i < hash.Length; i++)
            {
                Console.Write("{0:X2} ", hash[i]);
            }
            Console.WriteLine();
            Thread.Sleep(0);
        }
    }
}

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

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

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


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

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

12   голосов , оценка 4 из 5
Похожие ответы