如何在CMD / c ++中重命名包含特殊字符的文件?

时间:2020-11-01 22:51:36

标签: c++ file cmd rename system

今天,我正在努力解决一个问题,而在其他帖子上,这个问题已经解决了一半。

这是我尝试通过系统命令使用dos命令在c ++中执行的操作:

command = "s: && cd " + all_paths[i] + " && rename \"" + linestring + "\" \"" + completeCorrectName+"\"";
//what it really contain is => "s: && cd S:\\Holliday\\Spain\\ && rename \"Spain - été 2018 !.mkv\" \"Spain - pool 2018.mkv\""
system(command.c_str());

这是我通过c ++程序启动的dos命令,因此我可以使用更多本地功能。

一切正常!除非我不能重命名包含特殊字符的文件。因此,我收到一个错误:“无法访问指定的文件”。那是因为特殊字符存储在我的字符串变量中,如下所示:

"maŒtre et ‚lŠve.mkv"

所以我尝试了"wstring",我尝试了"#Define UNICODE",也尝试了"#Define _UNICODE" ...什么都没用。

编辑:因为使用了dir方法,所以我使用了cmd / dos。 我这样保存dir方法:

command = "s: && cd " + all_paths[i] + " && dir /a-d /o-d /b *";
            FILE* fpipe = _popen(command.c_str(),"r"); // run dir command and save it inside fpipe => memory file
            if (fpipe) // If we can read it successfully
            {
                char line[500];
                string linestring;
                while (fgets(line, 500, fpipe)) // looping on each line
                {
                    linestring.clear();
                    for (int j : line) //Convert buffer in string
                    {
                        linestring.push_back(j);
                    }
              }

1 个答案:

答案 0 :(得分:-1)

问题已解决: 确实,dir命令无法正确保存utf8,我被迫寻找另一种方法。 我从github上获取了“ dirent.h”,它在几行中解决了该问题:

        DIR* directory = opendir(path);
        struct dirent* direntStruct;

        if (directory != NULL)
        {
            while (direntStruct = readdir(directory))
            {
                printf("File Name: %s\n", direntStruct->d_name);
            }
        }

但是,它仍然无法处理这样的字符:'œ' 因为这真的很特别,所以大约两个字母合为一个。 例如原始名称:

"Breach - 160 - Testament - Ton cœur est ici.mkv"

将被读取为:

B4RHTQ~A.MKV

这是dirent.h框架中的内部问题,无论如何,如果您尝试重命名该文件,它仍然可以工作!只是不要期望从文件名中获取信息... 我没有找到解决方案。