#c_sharp #файлы
Сейчас при первом запуске программы я считаю хэш файла, сохраняю его и во время второго запуска просто сравниваю его со вновь посчитанным. Проблема в том, что это долго. Хотелось бы уметь проверять файл на изменения без подсчёта хэша. Тут можно было бы запоминать время последнего изменения, но никто не гарантирует, что файл не заменят другим файлом с таким же временем последнего изменения. Такие гарантии можно было бы получить запоминанием inode, но пока я не могу найти как в C# по имени файла получить inode. Да и работать это будет не на всех файловых системах. Как лучше всего решить эту проблему? Как это делает, например, Dropbox?
Ответы
Ответ 1
Я бы посоветовал просто проверить дату последнего изменения. Объясняю, почему. Если вы хотите выяснить, изменился ли файл обычным образом -- то есть, не редактировал ли его кто-то, проверки даты должно быть достаточно. Это -- правильный, честный способ. Если же вы хотите переиграть злонамеренного пользователя, то вы уже проиграли: он может сделать что угодно, выставить любую дату изменения, подменить контрольную сумму, которую ваша программа где-то хранит, подменить содержимое файла при запросе только от вашей проверяющей процедуры, да что угодно. Не пытайтесь выиграть на чужом поле.Ответ 2
Гарантированный (условно, коллизии неизбежны) результат даст только вычисление хэша. Если у тебя это долго, значит необходимо выбрать более быстрый алгоритм.Ответ 3
Я считаю, что необходимо оптимизировать максимально чтение файла (например, использовать напрямую функцию Win32API ReadFile) и сделать оптимизированную имплементацию хеш-функции, например, написать ее на ассемблере. Но для начала просто проверять modification time. Если не изменилось, тогда проверять размер файла, если не изменился, считать хеш.
Комментариев нет:
Отправить комментарий