Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 26.12.2013
Сообщений: 95

Как получить хэш папки?

25.06.2018, 04:24. Показов 3043. Ответов 15

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Нарыл вот такуюl темку, однако ругается на последнюю строчку кода, якобы md5 не определено в данном фрагменте. Пробовал подвинуть, не работает :c. Вопрос у меня такой: я пишу апдейтер для своей программы. Соответственно, при каждом запуске апдейтер проверяет хэш каждого файла на клиенте, на сервере, сравнивает и т.д. Пользуюсь следующим кодом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
static 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.06.2018, 04:24
Ответы с готовыми решениями:

Как получить MD5-хэш введенного пароля?
Всем доброго времени суток. Сейчас пишу простенький лаунчер для своего сервера и он должен брать данные из базы данных. В базе пароли...

Как получить хеш папки?
По нажатию на кнопку в textBox1 должен выводиться хеш папки с файлами. Папка называется "alt" После нажатия на кнопку выдает...

Как получить содержимое папки?
Допустим я через диалог указываю папку, а мне,например, в комбобокс выводятся названия всех файлов в папке, а я через комбобокс запускаю...

15
Эксперт .NET
 Аватар для Usaga
14303 / 9388 / 1354
Регистрация: 21.01.2016
Сообщений: 35,398
25.06.2018, 06:09
YProgramm, зачем хеши какие-то? В сборке\сборках прописываются их версии. Вот это и надо сравнивать.
0
Эксперт .NET
 Аватар для Rius
13137 / 7697 / 1677
Регистрация: 25.05.2015
Сообщений: 23,485
Записей в блоге: 14
25.06.2018, 06:31
Цитата Сообщение от YProgramm Посмотреть сообщение
Как мне получить хэш для папки?
Не обязательно его получать. Есть список файлов, у каждого свой хеш. Вот с этим и работать.
Цитата Сообщение от Usaga Посмотреть сообщение
зачем хеши какие-то? В сборке\сборках прописываются их версии. Вот это и надо сравнивать.
Не все файлы в программе исполняемые и с версией.
0
Эксперт .NET
 Аватар для Usaga
14303 / 9388 / 1354
Регистрация: 21.01.2016
Сообщений: 35,398
25.06.2018, 06:42
Цитата Сообщение от Rius Посмотреть сообщение
Не все файлы в программе исполняемые и с версией.
Верно, но не обязательно проверять же вообще всё. Достаточно свою версию (версию EXE) сравнить со свежей на сервере и, если что, качнуть инсталлятор, который всё и обновит.
0
Эксперт .NET
 Аватар для Rius
13137 / 7697 / 1677
Регистрация: 25.05.2015
Сообщений: 23,485
Записей в блоге: 14
25.06.2018, 07:28
Если рассматривать программу как простую программу, да. Можно просто скачать новый инсталлятор.

Если хочется делать обновление отдельных файлов, то лучше делать аналогично другим таким же продуктам. Т.е. запускаторам игр.
Там это средство не только обновления, но и восстановления рабочего состояния. Т.к. файл с версией программы может быть и последним, а какой-то важный файл с данными - повреждён, то требуется возможность выполнения полной проверки всего дерева каталогов/файлов, а не одной версии.
Данная функциональность имеется как минимум у 4Game, Elite Dangerous, EVE Online, Steam.

Возможно, ТС-ом средство выбрано неуместное.
0
Эксперт .NET
 Аватар для Usaga
14303 / 9388 / 1354
Регистрация: 21.01.2016
Сообщений: 35,398
25.06.2018, 07:38
Rius, ну, это получается написание своего собственного инсталлятора.
0
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
25.06.2018, 09:39
Цитата Сообщение от Usaga Посмотреть сообщение
ну, это получается написание своего собственного инсталлятора
ну инсталлятор это немного по другому

автору могу дать такой небольшой пример своего
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class ProgramFile {
    public string Hash { get; set; }
    public string RelativePath { get; set; }
}
 
class QueuedFile {
    public string RelativePath { get; set; }
    public string DestPath { get; set; }
}
 
private async Task Download() {
    var client = new WebClient() { BaseAddress = Url };
 
    try {
        var serializer = new JavaScriptSerializer();
        var json = await client.DownloadStringTaskAsync("/api/files");
        var files = serializer.Deserialize<IEnumerable<ProgramFile>>(json);
        var currentDirectory = Directory.GetCurrentDirectory();
        var queue = new Queue<QueuedFile>();
 
        foreach (var file in files) {
            var destPath = Path.Combine(currentDirectory, file.RelativePath);
            var destDir = Path.GetDirectoryName(destPath);
 
            Directory.CreateDirectory(destDir);
 
            if (NeedUpdate(destPath, file.Hash))
                queue.Enqueue(new QueuedFile() { DestPath = destPath, RelativePath = file.RelativePath });
        }
 
        while (queue.Any()) {
            var file = queue.Dequeue();
            var bytes = await client.DownloadDataTaskAsync($"/api/files/?path={file.RelativePath}");
            File.WriteAllBytes(file.DestPath, bytes);
        }
    }
    catch (Exception ex) {
        var msg = $"{ex.Message}\r\n\r\nПродолжить без обновления?";
        if (MessageBox.Show(this, msg, "Ошибка", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.No)
            Process.GetCurrentProcess().Kill();
    }
    finally {
        client.Dispose();
    }
 
    var exe = GetExeFile();
    if (exe != null) {
        var si = new ProcessStartInfo() {
            UseShellExecute = true,
            FileName = exe.FullName,
            Verb = "runas"
        };
 
        Process.Start(si);
    }
    else {
        MessageBox.Show(this, "Не удалось найти исполняемый файл.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
 
    Process.GetCurrentProcess().Kill();
}
 
private bool NeedUpdate(string path, string hash) {
    if (!File.Exists(path))
        return true;
    var bytes = File.ReadAllBytes(path);
    using (var md5 = MD5.Create()) {
        var digest = md5.ComputeHash(bytes);
        return hash.ToLower() != BitConverter.ToString(digest).Replace("-", string.Empty).ToLower();
    }
}
1
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
25.06.2018, 10:05
Цитата Сообщение от YProgramm Посмотреть сообщение
однако ругается на последнюю строчку кода, якобы md5 не определено в данном фрагменте.
1) последняя строчка это return на неё вряд ли будет ругаться
2) ошибку желательно нормально описывать и показывать, а не якобы.
3) using System.Security.Cryptography;

прописан?
Цитата Сообщение от YProgramm Посмотреть сообщение
Пробовал подвинуть, не работает :c.
что подвинуть? куда подвинуть? описывайте свои проблемы/ошибки нормально и доступно, чтобы сразу становилось понятно, что у Вас случилось, иначе тут советовать нечего, только если как выше совсем другой метод подсчёта
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
25.06.2018, 11:13
Вобще можно использовать ClickOnce и не заморачиваться с инсталяторами/апдейтерами.
0
0 / 0 / 0
Регистрация: 26.12.2013
Сообщений: 95
25.06.2018, 12:29  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Достаточно свою версию (версию EXE)
Я делаю Updater для полноценного клиента игры, т.е. проверяю все файлы. Когда дизайнеры добавляют новую прическу какую-нибудь, например, она появляется в файлах игры и ее нужно докачать. Аналогично с изменением существующих вещей в игре.
Цитата Сообщение от Rius Посмотреть сообщение
Если хочется делать обновление отдельных файлов, то лучше делать аналогично другим таким же продуктам.
А зачем мне инсталлятор, если я просто раз в недельку-другую буду подкачивать пару файлов на клиент + их размер не такой большой (в пределах 200мб).
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
последняя строчка это return на неё вряд ли будет ругаться
В коде, который я привел, проблем нет: он выводит мне хэши файлов, а вот код из этой темы, который выглядит след. образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
byte[] buffer = new byte[4096];
 
using (var md5 = new MD5CryptoServiceProvider())
{
    foreach (var file in Directory.EnumerateFiles(@"Path\To\Folder", "*", SearchOption.AllDirectories))
    {
        int length;
        using (var fs = File.OpenRead(file))
        {
            do
            {
                length = fs.Read(buffer, 0, buffer.Length);
                md5.TransformBlock(buffer, 0, length, buffer, 0);
            } while (length > 0);
        }
    }
    md5.TransformFinalBlock(buffer, 0, 0);
}
 
Console.WriteLine(BitConverter.ToString(md5.Hash));
ругается на вот эту строку:
C#
1
Console.WriteLine(BitConverter.ToString(md5.Hash))
Пытался ее переместить под фигурную скобку, там ошибки нет, однако значение не выводит.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
25.06.2018, 14:27
Цитата Сообщение от YProgramm Посмотреть сообщение
нужно докачать.
я бьі делал так:

- на апдейт сервере хранить таблицу [версия апдейта + список обновляемых файлов]. Опциоанльно можно две таблицы, если файлов будет слишком много.
- при запуске игры запрашиваем список, исходя из текущей верисии. Например 1.25.
- на серваке допустим уже 1.28, т.е. есть целых 3 пака апдейтов.
- формируем список файлов для обновления и дальше уже либо отправляем одним паком (например zip), либо просто отдаем клиенту, а он уже сам обновляет согласно єтому списку.

Иметь возможно сравнить файльі по кешу для обьемньіх игр тоже нужно (для того же отката/проверки), но применять их для проверки апдейтом, как по мне, сильно затратно, запуска игрьі придется ждать вечность.
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
25.06.2018, 16:25
Цитата Сообщение от YProgramm Посмотреть сообщение
ругается на вот эту строку:

потому что переменная md5 выходит за область видимости using'a:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using (var md5 = new MD5CryptoServiceProvider())
{
    foreach (var file in Directory.EnumerateFiles(@"Path\To\Folder", "*", SearchOption.AllDirectories))
    {
        int length;
        using (var fs = File.OpenRead(file))
        {
            do
            {
                length = fs.Read(buffer, 0, buffer.Length);
                md5.TransformBlock(buffer, 0, length, buffer, 0);
            } while (length > 0);
        }
    }
    md5.TransformFinalBlock(buffer, 0, 0);
}
поместите эту строку перед скобкой закрывающейся:

C#
1
2
3
 md5.TransformFinalBlock(buffer, 0, 0); 
Console.WriteLine(BitConverter.ToString(md5.Hash));
}
Добавлено через 41 секунду
Цитата Сообщение от YProgramm Посмотреть сообщение
Пытался ее переместить под фигурную скобку, там ошибки нет, однако значение не выводит.
а почему не выводит значение уже смотрите под отладкой
0
0 / 0 / 0
Регистрация: 26.12.2013
Сообщений: 95
25.06.2018, 22:35  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
поместите эту строку перед скобкой закрывающейся
Спасибо за совет, я так и делал. Попробовал еще раз, на выводе поставил breakpoint: (см. скриншот).
Пробовал заменить метод на
C#
1
Console.WriteLine(Bitconverter.ToString(md5.ComputeHash)
- не компилит.
Миниатюры
Как получить хэш папки?  
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
26.06.2018, 09:10
Цитата Сообщение от YProgramm Посмотреть сообщение
Пробовал заменить метод на

C#
1
Console.WriteLine(Bitconverter.ToString(md5.ComputeHash)
так вы неверно вызываете, это не параметр, а метод, в Вашем случае надо так:
C#
1
Console.WriteLine(BitConverter.ToString(md5.ComputeHash(buffer)));
p.s. но у меня и первоначальный вариант работает
0
0 / 0 / 0
Регистрация: 26.12.2013
Сообщений: 95
26.06.2018, 11:27  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
но у меня и первоначальный вариант работает
Спасибо, разобрался. Я просто проверял папку размером в 2гб, поэтому просто подсчет был очень долгий. На маленьких папках все работает прекрасно (первоначальный). Буду искать альтернативу)
0
Эксперт .NET
 Аватар для Rius
13137 / 7697 / 1677
Регистрация: 25.05.2015
Сообщений: 23,485
Записей в блоге: 14
26.06.2018, 11:31
YProgramm, не по 4 кБ почитайте, а по 10 МБ. Возможно, будет пошустрее.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.06.2018, 11:31
Помогаю со студенческими работами здесь

Как получить папки в папках и т.д.?
// поиск папок на диске try { string dirPath = @&quot;D:\фотки&quot;; ...

Получить MD5-хэш для строк
вот как получить мд5 через пробел от такого отрывка кода: Console.WriteLine(s7 + i.ToString() + s2 + s0); мне надо чтобы было бы так: ...

Получить для строки хэш в виде числа
Как заменить строку числом ее хэша ?

Как получить все ресурсы(картинки) из папки ресурсов
Ну вопрос, заключается в том, что у меня есть несколько папок с картинками, такие как grass, wood. Мне надо получить в List все картинки...

Как получить иконку из файла или из папки?
Здравствуйте! Хочу сделать что-то типа проводника с использованием TreeView, только проблема в том, что не знаю как получить иконку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru