重命名目录中的所有文件

C++: Rename all files in a directory

本文关键字:文件 重命名      更新时间:2023-10-16

已取得的成就和坚持的事项清单,以帮助理解我所要求的内容

我的成就:

打开用户指定的目录,显示该目录下的所有文件

我还没有达到的目标:

根据预定义的名称自动重命名该目录下的所有文件-文件目前以随机字符命名,我希望自动将它们重命名为"August 1","August 2","August 3"等。文件有不同的扩展名,我希望这些扩展名保持不变。

这就是我打开和显示目录的方式:
void DirectorySelector::OpenDirectory(void)
{
    // convert directory string to const char
    DIRECTORY = directory.c_str();
    pdir = opendir (DIRECTORY);
}
void DirectorySelector::DisplayDirectory(void)
{
    // read directory
    while (pent = readdir (pdir))
    {
        std::cout << pent->d_name << "n";
    }
}

这就是我所坚持的,重命名文件(文件有不同的扩展名,不确定这是否会导致以后的问题?)

当程序到达while循环时,我得到以下错误:

在MultipleRename.exe中0x009657C1的未处理异常:0xC0000005:访问违反读取位置0xCCCCCDE0.

void DirectoryOperator::StandardRename(void)
{   
    i = 1;
    while (pent = readdir (pdir))
    {
        oldname = pent->d_name;
        newname = "August " + i;
        OLDNAME = oldname.c_str();
        NEWNAME = newname.c_str();
        rename(OLDNAME, NEWNAME);
        i++;
    }   
}

注意:所有声明都在其他地方处理,并且为了简单起见已经删除了验证,如果你需要代码,我可以发布它。此外,我已经检查了目录是否仍在DirectoryOperator类中打开,并且我在Windows上使用MSVS2012。

一行有问题:

newname = "August " + i;

"August "是一个char*,在将其转换为std::string之前将i添加到指针中。

所以,当i==1时,你的字符串将是"gust ",当它为2时,它将是"gust "。很快,当i> 8时,您将遇到未定义的行为。

解决方案:

newname = "August " + std::to_string(i); // c++11

#include<sstream>  
...
stringstream ss;
ss << "August " << i;
newname = ss.str();

"当程序到达while循环时,我得到以下错误:"

Unhandled exception at 0x009657C1 in MultipleRename.exe: 0xC0000005: Access violation reading location 0xCCCCCDE0.

很可能pdir没有正确初始化,当代码

while (pent = readdir (pdir))

。值0xC0000005表示您正在尝试解引用某处的nullptr

你确定吗?

pdir = opendir (DIRECTORY);

按预期顺序调用,结果是有效的(pdir != nullptr)?