C++ 重命名某一文件夹下的所有文件

说明


今天给家人快速下载了一些歌曲,奈何忘记修改歌曲命名格式,所有的歌曲都是 【singer - musicname.mp3】 这样的格式,这就会造成这个歌手的所有歌曲播放完后才能到下一个歌手,达不到随机听歌的效果,故想重命名一下名称

本来想用 std::filesystem 的一些东西,可是 C++17 以上才支持这个特性,所以手动写了个转换,以便后续使用

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//#include   // c++ 17 及其以上支持

// 获取某一文件夹下的所有文件
void getFileAbsolutePath(std::string path,
                         std::vector<std::string> &file_abs_path,
                         std::vector<std::string> &file_name )
{

    long hFile = 0;  //文件句柄
    struct _finddata_t fileinfo;   //自行查看_finddata、_findfirst 和 _findnext
    std::string p;
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
    {
        do
        {
            //如果是目录,迭代之,如果不是,加入列表
            if((fileinfo.attrib & _A_SUBDIR))
            {
                continue;
                if(strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                    getFileAbsolutePath( p.assign(path).append("\\").append(fileinfo.name), file_abs_path, file_name);
            }
            else
            {
                file_abs_path.push_back(p.assign(path).append("\\").append(fileinfo.name));
                file_name.push_back(fileinfo.name);
            }
        }
        while(_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
}

// 主程序
// 以下测试为将 【singer - musicname.mp3】 格式的文件重命名为 【musicname-singer.mp3】
// 注意:原有的名称 "-" 前后有空【空格】,而变换后没有了
int main()
{
    std::string folder = "D:/music";
    std::vector<std::string> file_abs_path, file_name;
    getFileAbsolutePath(folder, file_abs_path, file_name);
    for( int i = 0; i < file_abs_path.size(); i++ )
    {
        // 获取旧文件名
        std::string& old_abs_path = file_abs_path[i];
        auto const pos_splash = old_abs_path.find_last_of('\\');
        auto const pos_dot = old_abs_path.find_last_of('.');
        auto suffix = old_abs_path.substr(pos_dot);
        const auto old_name = old_abs_path.substr(pos_splash + 1, pos_dot - pos_splash - 1);

        // 合成新文件名
        auto const pos_underline = old_name.find_last_of('-');
        std::string prev_str = old_name.substr(0, pos_underline - 1);
        std::string next_str = old_name.substr(pos_underline + 2);

        // 重命名
        rename(old_abs_path.c_str(),
               (folder + "/" + next_str + "_" + prev_str + suffix).c_str());

        std::cout << "No." << i << std::endl;
    }

    return 0;
}

你可能感兴趣的:(面试汇总-,C/C++,编程语言,-,C++)