В чем разница между std::filesystem::copy()
а также std::filesystem::copy_file()
в этом коде?
#include <filesystem>
void testing()
{
const std::filesystem::path src = "foo.txt";
const std::filesystem::path dst = "bar.txt";
std::filesystem::copy( src, dst, std::filesystem::copy_options::overwrite_existing);
std::filesystem::copy_file(src, dst, std::filesystem::copy_options::overwrite_existing);
}
Документы говорят:
copy()
: «копирует файлы или каталоги»copy_file()
: «копирует содержимое файла»Поскольку в этом примере я копирую один файл, а не каталоги, являются ли эти два вызова одинаковыми?
(Я использую g ++ 8.2.0. Не забудьте ссылаться на libstdc ++ fs, иначе у вас будут неопределенные ссылки на std :: filesystem.)
Да, исключая ошибки или случаи, которых вы не ожидаете.
Если src
был тихо заменен каталогом, они ведут себя по-разному. Если dst
существует и является каталогом, я считаю, что они будут вести себя по-другому. Некоторые параметры копирования могут применяться к копированию, а не к copy_file.
Но при копировании из одного файла в другой файл или имя, файл которого не существует, copy
Запускает copy_file
,
Обратите внимание, однако, что кто-то может удалить foo.txt
и замените его на каталог между последней проверенной вами (скажем, предыдущей строкой) и вызовом copy
или же copy_file
, При реализации надежного взаимодействия с файловой системой вы не должны предполагать, что файловая система находится в определенном состоянии, и гарантировать, что ваш код написан с защитой. Для этого, если вы собираетесь скопировать один файл, используйте copy_file
, (И всегда проверяйте ошибки.)
С copy_options
вы используете, и исходный файл является файлом (а не каталогом), copy
позвоню copy_file
, Это не тот случай, если вы имеете дело с каталогами, символическими ссылками или жесткими ссылками.