как выполнить boost :: filesystem copy_file с перезаписью - PullRequest
39 голосов
/ 06 мая 2009

Функция Windows API CopyFile имеет аргумент BOOL bFailIfExists, который позволяет вам контролировать, хотите ли вы перезаписать целевой файл, если он существует.

Функция boost::filesystem copy_file не имеет такого аргумента и завершится ошибкой, если целевой файл существует. Есть ли элегантный способ использовать функцию boost copy_file и перезаписать целевой файл? Или лучше просто использовать Windows API? Моя текущая целевая платформа - Windows, но я предпочитаю использовать STL и улучшать, где это возможно, чтобы сохранить мою платформу кода независимой.

Спасибо.

Ответы [ 4 ]

61 голосов
/ 27 апреля 2010

Существует третий enum аргумент для copy_file, boost :: filesystem :: copy_option :: overwrite_if_exists

copy_file(source_path,destination_path,copy_option::overwrite_if_exists);
18 голосов
/ 16 ноября 2010

Остерегайтесь boost :: copy_file с copy_option :: overwrite_if_exists! Если целевой файл существует и он меньше исходного, функция будет перезаписывать только байты первого размера (from_file) в целевом файле.

По крайней мере, для меня это было оговоркой, поскольку я предположил, что copy_option :: overwrite_if_exists влияет на файлы , а не содержимое

9 голосов
/ 06 мая 2009

Проверьте, существует ли файл назначения первым, а если он существует, то удалите его:

if (exists (to_fp))
    remove (to_fp);
copy_file (from_fp, to_fp);

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

2 голосов
/ 06 мая 2009

Есть ли элегантный способ использовать функцию boost copy_file и перезаписать целевой файл?

Очевидно, нет прямого API для этого.

Или лучше просто использовать Windows API? Моя текущая целевая платформа - Windows, но я предпочитаю использовать STL и улучшать, где это возможно, чтобы сохранить независимость моей платформы кода.

Из документации:

Предложение о включении Boost.Filesystem в Технический отчет 2, N1975, было принято Комитетом по стандартам C ++. Библиотека Boost.Filesystem останется в соответствии с предложением о файловой системе TR2, так как она проходит через процесс TR2. Обратите внимание, однако, что пространства имен и гранулярность заголовка отличаются между Boost.Filesystem и предложением TR2.

Что настоятельно рекомендует придерживаться boost::filesystem - хорошая идея.

...