Ответ 1
Существует третий аргумент enum для copy_file, boost:: filesystem:: copy_option:: overwrite_if_exists
copy_file(source_path,destination_path,copy_option::overwrite_if_exists);
Функция API Windows 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);
Остерегайтесь 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 и поддерживать там, где это возможно, чтобы моя платформа кода была независимой.
Из документации:
Предложение N1975 о включении Boost.Filesystem в Технический отчет 2 было принято Комитетом по стандартам С++. Библиотека Boost.Filesystem останется в согласии с предложением файловой системы TR2, поскольку она прокладывает себе путь через процесс TR2. Обратите внимание, однако, что пространства имен и гранулярность заголовков различаются между Boost.Filesystem и предложением TR2.
Что сильно говорит о том, что прилипание к boost::filesystem
является хорошей идеей.