В чем разница между std :: filesystem :: copy () и std :: filesystem :: copy_file ()?

В чем разница между 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.)

2

Решение

Да, исключая ошибки или случаи, которых вы не ожидаете.

Если src был тихо заменен каталогом, они ведут себя по-разному. Если dst существует и является каталогом, я считаю, что они будут вести себя по-другому. Некоторые параметры копирования могут применяться к копированию, а не к copy_file.

Но при копировании из одного файла в другой файл или имя, файл которого не существует, copy Запускает copy_file,

Обратите внимание, однако, что кто-то может удалить foo.txt и замените его на каталог между последней проверенной вами (скажем, предыдущей строкой) и вызовом copy или же copy_file, При реализации надежного взаимодействия с файловой системой вы не должны предполагать, что файловая система находится в определенном состоянии, и гарантировать, что ваш код написан с защитой. Для этого, если вы собираетесь скопировать один файл, используйте copy_file, (И всегда проверяйте ошибки.)

4

Другие решения

С copy_options вы используете, и исходный файл является файлом (а не каталогом), copy позвоню copy_file, Это не тот случай, если вы имеете дело с каталогами, символическими ссылками или жесткими ссылками.

4

По вопросам рекламы [email protected]