如果newname指向不同的驱动器,rename实际上会复制文件(至少在Windows 10平台上是这样)。
有没有办法避免这种情况?在这种情况下,我希望它只是失败。
假设我想要移动100 GB的文件。如果可能的话,我只想给它重命名。如果没有-我想使用我自己的复制功能,并向用户显示操作的进度。
发布于 2019-05-16 02:02:39
您可以尝试创建到新目的地的硬链接。如果它失败了,它就失败了。如果成功,则删除原始文件。我验证了这对Linux (g++ 8.3.1和clang++ 7.0.1)和Windows (VS2019)上的文件(而不是目录)有效,并期望它也能在大多数其他现代操作系统上工作:es。需要C++17 (对于较旧的编译器,则为boost )。
#include <filesystem>
#include <iostream>
#include <string_view>
#include <vector>
bool my_rename(const std::string_view from, const std::string_view to,
std::error_code& ec)
{
// create hard link
std::filesystem::create_hard_link(from, to, ec);
if(ec) return false; // it failed
// remove the original
return std::filesystem::remove(from, ec);
}
int cppmain(const std::string_view program, std::vector<std::string_view> args) {
if(args.size() != 2) {
std::cerr << "USAGE: " << program << " <source> <target>\n";
return 1;
}
std::error_code ec;
if(my_rename(args[0], args[1], ec) == false) {
std::cerr << program << ": " << ec << "\n";
return 1;
}
return 0;
}
int main(int argc, char* argv[]) {
return cppmain(argv[0], {argv + 1, argv + argc});
}发布于 2019-05-15 22:33:51
如果在Windows中,你可以使用不带MOVEFILE_COPY_ALLOWED的MoveFileEx。您还可以使用GetVolumePathNameW来确定源和目标是否属于同一卷,从而确定是否(可能)需要拷贝。
https://stackoverflow.com/questions/56151795
复制相似问题