std::filesystem::copy() 和 std::filesystem::copy_file() 有什么区别?
What is the difference between std::filesystem::copy() and 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()
: "copies files or directories"
copy_file()
: "copies file contents"
由于在此示例中我复制的是单个文件而不是目录,所以这两个调用是否相同?
(我使用的是 g++ 8.2.0。记得 link 反对 libstdc++fs 否则你将有对 std::filesystem 的未定义引用。)
对于您正在使用的 copy_options
,并且源文件是一个文件(而非目录),copy
将调用 copy_file
。如果您处理的是目录、符号链接或硬链接,则情况并非如此。
是的,除非出现错误或您意想不到的情况。
如果 src
被静默替换为目录,它们的行为会有所不同。如果 dst
存在并且是一个目录,我相信它们的行为会有所不同。一些复制选项可能适用于复制而不适用于 copy_file。
但是当从一个文件复制到另一个文件或复制到一个文件不存在的名称时,copy
调用 copy_file
.
请注意,有人可以删除 foo.txt
并将其替换为您上次检查(比如上一行)和调用 copy
或 [= 之间的目录13=]。在实现健壮的文件系统交互时,你不应该假设文件系统处于特定状态,并确保你的代码是防御性的。为此,如果您打算复制一个文件,请使用 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()
: "copies files or directories"copy_file()
: "copies file contents"
由于在此示例中我复制的是单个文件而不是目录,所以这两个调用是否相同?
(我使用的是 g++ 8.2.0。记得 link 反对 libstdc++fs 否则你将有对 std::filesystem 的未定义引用。)
对于您正在使用的 copy_options
,并且源文件是一个文件(而非目录),copy
将调用 copy_file
。如果您处理的是目录、符号链接或硬链接,则情况并非如此。
是的,除非出现错误或您意想不到的情况。
如果 src
被静默替换为目录,它们的行为会有所不同。如果 dst
存在并且是一个目录,我相信它们的行为会有所不同。一些复制选项可能适用于复制而不适用于 copy_file。
但是当从一个文件复制到另一个文件或复制到一个文件不存在的名称时,copy
调用 copy_file
.
请注意,有人可以删除 foo.txt
并将其替换为您上次检查(比如上一行)和调用 copy
或 [= 之间的目录13=]。在实现健壮的文件系统交互时,你不应该假设文件系统处于特定状态,并确保你的代码是防御性的。为此,如果您打算复制一个文件,请使用 copy_file
。 (并始终检查错误。)