Вопрос

Функция 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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top