Подтвердить что ты не робот

Как выполнить boost:: fileystem copy_file с перезаписью

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

По-видимому, для этого нет прямого API.

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

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

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

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