как выполнить 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
хорошая идея.