В чем разница между 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, (И всегда проверяйте ошибки.)

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

Другие вопросы по тегам