一次重命名多个文件的 C++ 程序

Posted

技术标签:

【中文标题】一次重命名多个文件的 C++ 程序【英文标题】:C++ Program for Renaming Multiple Files at Once 【发布时间】:2019-12-16 04:47:02 【问题描述】:

我有一个包含名为 Slide1、Slide2、Slide3 等的 JPG 文件的目录,我想将它们重命名为我在名为“names.txt”的 txt 文件中编写的名称列表。每个新名称都在一行上,所以基本上我需要逐行读取这个 txt 文件并将每一行设为 JPG 文件的新名称。我需要对多个目录执行此操作,但我希望每个目录最多只能包含 60 个 JPG(我将使用相同的 names.txt 文件来重命名每个目录中的 JPG,因为是否存在重复的 JPG 并不重要目录之间的名称,唯一重要的是同一目录中没有两个 JPG 具有相同的名称)。

这是我到目前为止的代码。我知道一个问题是 char oldname[] 和 char newname[] 不能使用 + 运算符。那么如何将每个 JPG 的 char oldname[] 设为 Slide1、Slide2 等?至于 char newname[],我想也许我需要将 names.txt 的每一行作为字符串读取,然后将该字符串转换为 char 并将其设置为 char newname[],但我不知道该怎么做。

#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
using namespace std;

int main()

    int myNum;
    cout << "How many slides are there? Max 60." << endl;   
    cin >> myNum;

    if (myNum > 60)
           cout << "Add more names to names.txt in lyrics folder, then rerun program." << endl; 

    if (myNum <= 60)
           
        int nextNum = 1;
        fstream readname;
        readname.open("names.txt",ios::in);
        if (readname.is_open())
        
            string line;
            while (getline(readname,line))
            
                char oldname[] = "Slide" + nextNum + ".JPG";
                char newname[] = line + ".JPG"; 
                nextNum = nextNum++;
                if (nextNum == myNum+1)
                    break;
            
            readname.close();
        
    
    return 0;

如果有人可以解释如何使用字符串而不是字符来执行此操作,那也很好。这不是作业,只是个人项目,所以我可以使用的方法没有限制。

【问题讨论】:

如果您对用于 C++ 的文件系统库(与 .NET 文件系统库的工作方式非常接近)感兴趣,您可以在这里查看:ecs.syr.edu/faculty/fawcett/handouts/CSE687/code/… 有一个适用于 Linux 的版本也是。这可以帮助您管理目录等。 @Everyone - 我们通常避免建议 C++ STL 提供功能的第三方库。一个例外是 Hinnant 的日期/时间库,该库目前正在被 C++ 标准合并。 @DavidC.Rankin 我很清楚这一点。然而,OP表示这是一个个人项目,“他可以使用的方法没有限制”。这其实是我第一次在本站推荐第三方库。考虑到他可能需要 OS API 来批量正确处理目录,我只是认为这可以帮助他。 不用担心。我只是提出一般性观点。对于这个有限的应用程序,您可能 100% 正确。 @DavidC.Rankin 这就是为什么我没有把它放在答案中。 【参考方案1】:

从 C++11 开始,我们有一个函数 std::to_string,它接受一个数值并返回一个 std::string 对象。更多信息https://en.cppreference.com/w/cpp/string/basic_string/to_string

使用它你可以转换你的代码(在while循环中)如下:

std::string oldName = std::string("Slide") + std::to_string(nextNum) + ".JPG";
std::string newName = line + ".JPG";

希望这会有所帮助,

谢谢

【讨论】:

请注意 Rajkumar 甚至没有尝试使用 char 数组。这个很重要。当您进行字符串操作时,请使用string。使用char 数组会使复杂性提高一到两个数量级。【参考方案2】:

您根本不应该使用char[] 数组。只需改用std::string

std::string oldname = "Slide" + std::to_string(nextNum) + ".JPG";
// Or, if you are not using C++11 or later:
/*
std::ostringstream oss;
oss << "Slide" << nextNum << ".JPG";
std::string oldname = oss.str();
*/

string newname = line + ".JPG";

【讨论】:

以上是关于一次重命名多个文件的 C++ 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 中批量移动复制追加和重命名文件

如何确定文件最近一次重命名的时间?

如何在运行时分隔字符串?

怎么批量重命名多个文件夹里的图片

rename -n 选项在 cygwin 下似乎不可用

C++ 项目相关知识命名空间