C ++:重命名目录中的所有文件

时间:2014-08-15 18:35:44

标签: c++ file directory dirent.h

已经实现的目录以及我为帮助理解我的要求而坚持的目标

我取得的成就:

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

我还没有实现的目标:

根据预定义的名称自动重命名此目录中的所有文件 - 文件当前被命名为随机字符,我希望自动将它们重命名为" 8月1日和#34;," 8月2日" ," 8月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。

提前致谢。

2 个答案:

答案 0 :(得分:2)

该行存在问题:

newname = "August " + i;
8月&#34; 8月&#34;是一个char *,在将它转换为std :: string之前,我被添加到指针中。

所以,当i == 1时,你的字符串将是&#34; ugust&#34;,当它是2时,它将是&#34; gust&#34;。非常快,当我&gt; 8,你将遇到未定义的行为。

解决方案:

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

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

答案 1 :(得分:1)

  

&#34;一旦程序遇到while循环,我就会收到以下错误:&#34;

     

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)?