как выполнить boost :: filesystem copy_file с перезаписью
-
06-07-2019 - |
Вопрос
Функция Windows API CopyFile
имеет аргумент BOOL bFailIfExists
, который позволяет вам контролировать, хотите ли вы перезаписать целевой файл, если он существует. Р>
Функция boost :: filesystem
copy_file
не имеет такого аргумента и завершится ошибкой, если целевой файл существует. Есть ли элегантный способ использовать функцию boost copy_file и перезаписать целевой файл? Или лучше просто использовать Windows API? Моя текущая целевая платформа - Windows, но я предпочитаю использовать STL и улучшать, где это возможно, чтобы сохранить мою платформу кода независимой. Р>
Спасибо.
Решение
Существует третий аргумент enum для файла copy_file, boost :: filesystem :: copy_option :: overwrite_if_exists
copy_file(source_path,destination_path,copy_option::overwrite_if_exists);
Другие советы
Остерегайтесь наддува: копировать_файл с помощью copy_option :: overwrite_if_exists! Если целевой файл существует и он меньше исходного, функция будет перезаписывать только байты первого размера (from_file) в целевом файле. Р>
По крайней мере для меня это было оговоркой, поскольку я предполагал, что copy_option :: overwrite_if_exists влияет на файлы , а не на контент
Проверьте, существует ли файл назначения первым, а если он существует, то удалите его:
if (exists (to_fp))
remove (to_fp);
copy_file (from_fp, to_fp);
Или, если вас беспокоит появление файла между тестом и копией, вы можете записать во временный файл, а затем переименовать его в целевой файл.
Есть ли элегантный способ использовать функцию boost copy_file и перезаписать целевой файл?
Очевидно, нет прямого API для этого.
Или лучше просто использовать Windows API? Моя текущая целевая платформа - Windows, но я предпочитаю использовать STL и улучшать, где это возможно, чтобы сохранить независимость моей платформы кода.
Из документации:
Предложение N1975 о включении Boost.Filesystem в Технический отчет 2 было принято Комитетом по стандартам C ++. Библиотека Boost.Filesystem останется в соответствии с предложением о файловой системе TR2, так как она проходит через процесс TR2. Обратите внимание, однако, что пространства имен и гранулярность заголовка отличаются между Boost.Filesystem и предложением TR2.
Что настоятельно рекомендует придерживаться boost :: filesystem
.