Показать полную графическую версию : Вычисление md5 хеш суммы файла с прогресс баром.
DoroViska
06-08-2014, 20:17
Задача вычислять md5 хеш сумму файла и отображать ход вычисления в прогресс баре.
метод уже готов осталось только как-то отобразить ход в прогресс баре.
private string ComputeMD5Checksum(string path)
{
using (FileStream fs = System.IO.File.OpenRead(path))
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] fileData = new byte[fs.Length];
fs.Read(fileData, 0, (int)fs.Length);
byte[] checkSum = md5.ComputeHash(fileData);
string result = BitConverter.ToString(checkSum).Replace("-", String.Empty);
return result;
}
}
осталось только как-то отобразить ход в прогресс баре.»
В приведённом коде нечего отображать в «прогресс баре». Разве что 0% до и 100% после.
DoroViska
06-08-2014, 21:12
Iska, Ага нах нечего. 27 гб вычисляется минут 5 на галимом пк. висячая надпись подождите идёт вычисление md5 для нубка говорит о том что надо закрыть приложение буд-то оно зависло.
DoroViska, обсценная лексика на конференции не приветствуется.
Как Вы предлагаете «влезть» внутрь метода «.ComputeHash()»?
DoroViska
07-08-2014, 17:07
Iska, Вот тут то и дело что никак. а есть другие методы или либа ? может чё есть?
а есть другие методы »
Смотрите, пробуйте: md5 with progressbar - Поиск в Google (https://www.google.ru/search?q=md5+with+progressbar), может, найдёте подходящее по Вашим потребностям.
Вам, собственно, зачем сам хэш, под какие цели?
DoroViska
08-08-2014, 08:40
Да лаунчер для обновления игры.
Нужен более конкретный ответ. Как результат исчисления MD5 там используется?
DoroViska
08-08-2014, 09:29
Iska, Для проверки файлов игры. кеш запрашиваться с сервера и лаучнер должен проверить игру.
И 27 Gb у одного из файлов? Что ж это за игра-то.
Используйте менее трудоёмкие варианты, например, CRC32. Читайте и вычисляйте кусками, например, по 8-16 Мб (и тут-то делайте прогресс-бар), складывайте полученные хэши кусков в строку, затем хэшируйте саму эту строку. Вариантов много.
Вы ранее приведённую ссылку на поиск смотрели, пробовали подбирать что-нибудь?
27 гб вычисляется минут 5 на галимом пк »
Вы свою программу без прогресс-бара проверяли?
Поясните вот этот кусок:
byte[] fileData = new byte[fs.Length];
fs.Read(fileData, 0, (int)fs.Length); »
Насколько я понимаю, вы создаете массив размером = длина файла, а потом копируете весь файл в память. У вас 27 Гб ОЗУ? Начните с чтения учебника по .NET, к примеру...
Читайте и вычисляйте кусками, например, по 8-16 Мб (и тут-то делайте прогресс-бар), складывайте полученные хэши кусков в строку, затем хэшируйте саму эту строку. »Да, часто бывает метод типа Update(byte []), которому можно по кускам скармливать...
Да, часто бывает метод типа Update(byte []), которому можно по кускам скармливать... »
Нет, тут я как раз напрямую говорю — мы не считаем хэш всего файла. Мы считаем хэши мелких кусков, склеиваем их в одну переменную (хоть массивом байт, хоть строкой) и ещё раз считаем хэш, теперь уже этого полученного набора. В авторском случае неважно считать хэш на весь файл или таким вот макаром. Хотя для самой задачи обновления давно есть решение — MSI.
Delirium
29-08-2014, 07:06
висячая надпись подождите идёт вычисление md5 для нубка говорит о том что надо закрыть приложение буд-то оно зависло »
Ну раз уж нет возможности читать по кускам, добавьте вы надпись: Старт в <время>, покажите Прогресс бар, который не по квадратикам заполняется, а постоянно (свойство контрола). И добавьте текст - примерное время обновления - 5 минут. И в отдельном потоке таймер выполнения.
Когда человек видит, что на форме что то "тикает", это указывает ему на то, что приложение не зависло...
Delirium, в этом случае не прогресс-бар нужен, а, скорее, что-то наподобие такого:
http://i.imgur.com/eQZOSXL.gif
в этом случае не прогресс-бар нужен, а, скорее, что-то наподобие такого »Не люблю когда такие элементы на прогресс бар похожими делают (квадратики циклически бегают).
Так я и говорю, что не в виде полосы, а в виде круга.
Предложение же коллеги Delirium имеет право на жизнь в том случае, если время вычисления хэша объёма всего файла пропорционально коррелирует со временем вычисления хэша небольшой части, взятой для оценки. Т.е., к примеру, если соблюдается примерное соотношение (время вычисления MD5 для 1Gb / 2¹⁰) ≈ время вычисления MD5 для 1Mb. Так оно или нет — я не знаю, не проверял.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.