readdir():重新读取某些文件

时间:2013-02-17 00:33:27

标签: c++ readdir dirent.h

我有一个函数,其任务是重命名文件夹中的所有文件,但是,它重新命名某些文件: http://i.imgur.com/JjN8Qb2.png,每十分之一的数字都会出现同样的“错误”。究竟是什么导致了这个“错误”?

该函数的两个参数是文件夹的路径以及第一个文件应该具有的起始值。

int lookup(std::string path, int *start){
        int number_of_chars;
        std::string old_s, file_format, new_s;
        std::stringstream out;
        DIR *dir;
        struct dirent *ent;

        dir = opendir (path.c_str());
        if (dir != NULL) {
            // Read pass "." and ".."
            ent = readdir(dir);
            ent = readdir(dir);
            // Change name of all the files in the folder
            while((ent = readdir (dir)) != NULL){
                // Old string value
                old_s = path;
                old_s.append(ent->d_name);
                // Get the format of the image
                file_format = ent->d_name;
                number_of_chars = file_format.rfind(".");
                file_format.erase(0,number_of_chars);
                // New string value
                new_s = path;
                out << *start;
                new_s += out.str();
                new_s.append(file_format);
                std::cout << "Successfully changed name on " << ent->d_name << "\tto:\t" << *start << file_format << std::endl;
                // Switch name on the file from old string to new string
                rename(old_s.c_str(), new_s.c_str());

                out.str("");
                *start = *start+1;
            }
            closedir (dir);
        }
        // Couldn't open
        else{
            std::cerr << "\nCouldn't open folder, check admin privileges and/or provided file path\n" << std::endl;
            return 1;
        }

        return 0;
    }

2 个答案:

答案 0 :(得分:0)

我看到可能出现的问题:

  • 重命名文件会导致它们被送到您的算法两次。
  • 您计算新文件名的算法错误。

您应该能够轻松地为此编写测试,这反过来应该可以帮助您解决问题或编写更具体的问题。除此之外,我没有看到任何严重的问题,但如果你稍微减少变量的范围,这将有所帮助,这将确保不同的迭代不会相互影响。

答案 1 :(得分:0)

您正在将文件重命名为原始文件所在的文件夹,从而导致无限循环。您将04.png重命名为4.png,但由于您正在迭代文件夹中的所有文件,因此您将在某个时刻迭代到“新”4.png文件(在您的文件中,在第40次迭代)并将该文件重命名为40.png,依此类推......

使用最小化更改解决此现有代码的最简单方法是使用新名称将文件“重命名”(移动)到临时文件夹。类似的东西:

new_s = temp_path;
out << *start;
new_s += out.str();
new_s.append(file_format);
// Switch name on the file from old string to new string
rename(old_s.c_str(), new_s.c_str());

当你完成重命名pathwhile循环之外)中的所有文件时,删除文件夹并“重命名”(移动)temp_path到`path:

closedir (dir);
deletedir(path);
rename(temp_path, path);

`