【问题标题】:C++: Rename all files in a directoryC ++:重命名目录中的所有文件
【发布时间】:2014-10-09 12:40:19
【问题描述】:

已取得的成就列表以及我坚持以帮助理解我所要求的内容

我所取得的成就:

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

我还没有达到的目标:

根据预定义的名称自动重命名此目录中的所有文件 - 文件当前命名为随机字符,我希望将它们自动重命名为“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。

提前致谢。

【问题讨论】:

  • “根据预定义的名称自动重命名此目录中的所有文件”您对此点的具体条件/要求是什么?
  • 这些文件目前被命名为随机字符,我希望将它们重命名为“August 1”、“August 2”、“August 3”等。抱歉在文本中没有说清楚,认为代码比我解释得更好
  • 但是如果我理解正确的话,你想保留实际的文件扩展名吗?您应该编辑您的问题,以指出您的代码存在的实际问题。
  • 顺便说一句,用于处理路径、文件名、扩展名 a.s.o.,您可能会发现 boost::filesystem 类很有用。
  • @πάνταῥεῖ 已编辑问题并调查 boost::filesystem,谢谢

标签: c++ file directory dirent.h


【解决方案1】:

“程序一执行 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)?

【讨论】:

  • 是的,你是对的,在 DirectorySelector 和 DirectoryOperator 类之间的某个地方 pdir 似乎出错了
【解决方案2】:

线路有问题:

newname = "August " + i;

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

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

解决方案:

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

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

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 2015-02-28
    • 2014-11-08
    • 2013-08-20
    • 2014-11-29
    • 1970-01-01
    • 2014-12-30
    • 2023-03-25
    • 2010-12-29
    相关资源
    最近更新 更多