Вы, вероятно, можете полностью пропустить шаг 1.Файл нельзя удалить, пока он открыт, и выбор соответствующих флагов блокировки при открытии может также помешать его изменению.Например, функция CreateFile принимает аргумент dwShareMode.
Вам необходимо вычислить всю сигнатуру rdiff, прежде чем вы сможете начать создавать дельту rdiff.Вы можете избежать чтения всего файла, вычисляя подписи и затем дельты для каждого (скажем) 100 МБ блока файла за раз.Таким образом, вы потеряете эффективность сжатия *.Можно также подумать о переключении с rdiff на xdelta , который может создать дельта-файл за один проход по входу.
Сжатие и шифрование могут выполняться параллельно с вычислением дельты.Если сжатие и шифрование выполняются отдельными программами, они часто позволяют читать со стандартного ввода и записывать в стандартный вывод.Это проще всего использовать для конвейера в командном файле, например:
rdiff signature oldfile oldfile.sig
rdiff delta oldfile.sig newfile | gzip -c | gpg -e -r ... > compressed_encrypted_delta
Если вы используете библиотеки для сжатия / шифрования в своей программе, вам нужно будет выбрать библиотеки, поддерживающие потоковую операцию.
* или потерять большую эффективность, если данные перемещаются в файле.Если кто-то добавит 100 МБ к файлу 10 ГБ, rdiff создаст дельта-файл размером около 100 МБ.rdiff, выполненный в блоках по 100 МБ или меньше, будет производить около 10 ГБ дельты.Блоки размером 200 МБ будут давать около 5 ГБ дельты, поскольку только половина данных в каждом блоке относится к соответствующему блоку старой версии файла.