Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将所有文件从一个目录移动到另一个目录_C++_Linux_File - Fatal编程技术网

C++ C++;将所有文件从一个目录移动到另一个目录

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

我在将数据从一个目录移动到另一个目录时遇到问题。 我想用C++执行以下操作(bash):

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);
        }
    }
}