添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

虽然c++学的很菜,但是还是得想办法用起来。这里我们将某一个目录下的所有图片文件移动到自己指定的另一个目录下,同理移动其他类型的文件可以更改一下文件后缀即可。

笔者将整个过程分成了两步:收集目录下的满足后缀条件的文件路径和移动文件到目标路径下。这里用的是标准库filesystem,代码也比较简单。

一.收集目录下的所有图片路径

我们使用directory_iterator拿出目录下的所有文件,然后根据文件的后缀判断是不是jpg或者png文件。然后将所有的jpg,png文件放入一个vector中,这样就收集完成了,代码如下:

vector<fs::path> collect_files(string dir)
    auto files=vector<fs::path>();
    auto iterator=fs::directory_iterator(dir);
    for(auto p:iterator)
        auto file=p.path();
        //这里迭代拿出来的实际上是directory_entry对象
        //用directory_entry的帕特和方法即可转换到path对象
        if(file.extension()==".png"||file.extension()=="jpg")
            files.push_back(p.path());
    return files;

有关path对象的可以看这篇博客:path对象

二.移动文件

第二步移动文件使用rename函数即可,代码如下:

void remove_files(vector<fs::path> files,string dir)
    fs::path new_dir=fs::path(new_dir);
    if(!fs::exists(dir))
        fs::create_directory(new_dir);
    for(auto p:files)
        fs::path new_path=new_dir/p.filename();
        fs::rename(p,new_path);

这样我们就完成文件的移动了。

三.编译运行

笔者使用的是g++编译的,命令如下:

 g++ --std=c++17 -lstdc++fs collect_jpgpng.cpp -o collect

然后运行:

./collect 被移动文件的目录 目标目录

完整代码如下:

#include<iostream>
#include<filesystem>
#include<vector>
#include<string>
namespace fs=std::filesystem;
using namespace std;
vector<fs::path> collect_files(string dir)
    auto files=vector<fs::path>();
    auto iterator=fs::directory_iterator(dir);
    for(auto p:iterator)
        auto file=p.path();
        if(file.extension()==".png"||file.extension()=="jpg")
            files.push_back(p.path());
    return files;
void remove_files(vector<fs::path> files,string dir)
    fs::path new_dir=fs::path(dir);
    if(!fs::exists(dir))
        fs::create_directory(new_dir);
    for(auto p:files)
        fs::path new_path=new_dir/p.filename();
        fs::rename(p,new_path);
int main(int argc,char *argv[])
    //argv[0]:source_dir,argv[1]:target_dir
    auto files=collect_files(argv[1]);
    remove_files(files,argv[2]);
    return 0;
                                    功能: 给一个文件重命名用 法: int rename(char *oldname, char *newname);头文件:#include &lt;stdio.h&gt;说明:用该函数可以实现文件移动功能,把一个文件的完整路径的盘符改一下就实现了这个文件移动。具体参见下面的程序示例说明。#include &lt;stdio.h&gt;int rename(const char *oldpath...
                                    说明:C++访问文件夹中的内容没有python方便,这里做一下记录,提供实现数据从一个文件夹转移到另一个文件夹的接口。
应用场景:批量跑数据时,为了不在内部接口中输入当前数据的路径,避免层层传参数的麻烦,只在最里面的接口建一个临时文件夹,保存中间生成的文件,最后跳出最外层接口时,将临时文件夹里的内容全部复制到当前数据的路径下。
//将临时文件夹里的文件全部复制到相应数据的文件夹下面,并对临时文件夹进行清空处理,为下一套数据腾地方
void copy_file()
    std::string s
需要C++ 17:右击 -> 属性 -> C/C++ -> Language参考:windows - How to use C++ to Copy A Directory - Stack Overflow
                                    ,最近正好又需要这样的功能,而且还增加了一个需求,希望能够记录移动的具体内容,并且能够根据记录实现恢复功能,这个实现起来没什么难度,唯一需要注意的是,记录需要加锁,并且考虑到程序崩溃等问题,需要将每次成功或者失败记录即时写入文件,而不能在程序结束时写入,否则程序一旦崩溃,所有的移动记录将丢失。于是我写了一个类,实现了文件目录移动,纯c++实现,可以记录移动过程,也有恢复功能呢,可以指定记录的文件名,默认为"restore.log"。注意,部分函数需要另外实现,实现起来也不难,欢迎交流与讨论。
inline bool isSpecialDir(const char *path)
	return strcmp(path, "..") == 0 || strcmp(path, ".") == 0;
bool moveDir(const _tstring& srcPath, const _tstring& dstPath)
                                    c++复制文件有多种方式,比如可以采用system输入dos命令,他会弹出终端窗口,或者通过
copyfile函数进行复制
			if (!CopyFile(str + _T("\\data.fba"), __m_strPath + _T("\\data.fba"), FALSE))
				::MessageBox(NULL, _T("安装过程失败"), NULL, NULL);
	wstring  strsavepath = lpOutPutDir;
	strsavepath += L"classified";
	string imgsavepath = StringConvert::ws2s(strsavepath);
	const char* dir = imgsavepath.c_str();
	if (_access(dir, 0) == -1)
		_mkdir(dir);
	for (int i = 0; i &l
                                    #include "Shellapi.h"
#include "tchar.h"
#pragma comment(lib,"shell32.lib") //告诉编译器在编译形成的.obj文件和.exe文件中添加一条信息,使得连链接器在链接库时去直接找shell32.lib这个库,不要去找别的库
在相应的函数中添加如下代码
SHFILEOPSTRUCT fop;
fop.wFunc = F