как выполнить boost:: файловая система копировать файл с перезаписью

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

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

спасибо.

4 ответов


третий перечисление аргумент в copy_file, boost:: filesystem:: copy_option:: overwrite_if_exists

copy_file(source_path,destination_path,copy_option::overwrite_if_exists);

остерегайтесь boost::copy_file с 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 и boost, где это возможно, чтобы моя платформа кода была независимой.

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

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

что сильно предполагает, что придерживаться boost::filesystem хорошая идея.