C++ C++;将所有文件从一个目录移动到另一个目录
我在将数据从一个目录移动到另一个目录时遇到问题。 我想用C++执行以下操作(bash):C++ C++;将所有文件从一个目录移动到另一个目录,c++,linux,file,C++,Linux,File,我在将数据从一个目录移动到另一个目录时遇到问题。 我想用C++执行以下操作(bash): mv/testdir/*/testdest/ 因此,它基本上应该将位于/testdir中的所有文件移动到/testdest。 在C++中,我已经尝试过重命名< /代码>,但是它实际上并不移动数据,它只是重命名目录。 我当前的代码: #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include &l
mv/testdir/*/testdest/
因此,它基本上应该将位于/testdir
中的所有文件移动到/testdest
。
在C++中,我已经尝试过<代码>重命名< /代码>,但是它实际上并不移动数据,它只是重命名目录。
我当前的代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <iostream>
#include <unistd.h>
#include <dirent.h>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <string>
#include <sys/stat.h>
#include <syslog.h>
#include <fstream>
using namespace std;
int main( int argc, char *argv[] )
{
rename (argv[1], argv[2])
}
其效果是将/testdir/
重命名为/testdest/
(及其内容)。
在此之后,/testdir/
不再可用,这不是预期的结果。您可以使用它收集所有路径,然后循环使用&nftw
使用,closedir
,(您可以直接使用)
对于最近的C++17实现,您可能会使用
如果其他进程正在写入子目录,您可能会遇到麻烦(正如mv
可能遇到的那样)
也许在另一个进程中运行/bin/mv
(该文件路径由POSIX标准化)会更简单
如果/testdir
和/testdest
在不同的文件系统(和装载点)中,可能会出现问题,因为它们只在一个文件系统中工作mv
知道如何处理(在这种情况下,它会在删除源之前复制文件)。另外,/testdir
的一些子目录可能是挂载点等
如果/testdir/
和/testdest/
都在同一个文件系统中,并且/testdir
下没有装入点,您可以使用opendir
,readdir
,closedir
循环,跳过
和条目,为每个目录条目构造相应的完整源路径和目标路径,并在这些路径上使用rename
当然,mv
是免费软件,在中,你可以研究它的源代码(它没有你可能相信的那么简单,因为它处理的是极端情况)。您还可以使用来了解某些mv
命令或过程涉及哪些(中列出的)
// static-mv.cpp
#include<experimental/filesystem>
#include<cassert>
#include<iostream>
int main(int argc, char* argv[]){
assert(argc >= 3);
namespace fs = std::experimental::filesystem;
for(fs::path p : fs::directory_iterator(argv[1])){
std::cout << p << " -> " << argv[2]/p.filename() << std::endl;
fs::rename(p, argv[2]/p.filename());
}
}
$mkdir dir2代码>
$/静态mv dir1 dir2
"dir1/file.a" -> "dir2/file.a"
"dir1/file.b" -> "dir2/file.b"
$ls dir2/
file.a file.b
$success代码>
bash: success!: command not found...
void移动(char const*sorc,char const*dst,bool createRoot=true){
命名空间fs=std::实验::文件系统;
if(createRoot)
创建目录(dst);
for(fs::path p:fs::directory_迭代器(sorc)){
fs::path destFile=dst/p.filename();
if(fs::is_目录(p)){
fs::创建_目录(destFile);
move(p.string().c_str(),destFile.string().c_str(),false);
}否则{
//std::难道你必须写一个循环,它在bash中也不是一个单独的操作。它非常重要,因为它处理了大量的选项。我建议你仔细研究一下,并给出提示:mv/testdir/*/testdest/
扩展到参数mv
/testdir/a
testdir\B
testdir\C
testdest代码>所以…如果我想移动所有文件,我需要一个接一个地移动(在循环中?)mv
如果文件在同一个文件系统中,只需更改目录项,但如果数据跨越边界,则必须移动数据。从C++17开始就被弃用,给出以下错误\ifndef\u沉默\u实验性\u文件系统\u弃用\u警告\35e提供std::EXPERIMENTAL::filesystem的头被Microsoft弃用,\R\nEMOVED。它被提供std::filesystem的C++17头文件所取代。\n您可以定义“静默”实验“文件系统”弃用“警告”来确认您已收到此警告。#endif//\u静默”实验“文件系统”弃用“警告”
@ShubhamJain,是否更新答案?此外,您正在使用Microsoft进行编译,wh这不太可能适用于这个linux问题(使用了linux标记)。
bash: success!: command not found...
void move(char const *sorc, char const *dst, bool createRoot = true) {
namespace fs = std::experimental::filesystem;
if (createRoot)
fs::create_directory(dst);
for(fs::path p: fs::directory_iterator(sorc)){
fs::path destFile = dst/p.filename();
if (fs::is_directory(p)) {
fs::create_directory(destFile);
move(p.string().c_str(), destFile.string().c_str(), false);
} else {
//std::cout << "updated " << p.string().c_str() << std::endl;
fs::rename(p, destFile);
}
}
}