1

我有一个功能,其任务是重命名文件夹中的所有文件,但是,它重新命名某些文件: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;
    }
4

2 回答 2

0

我看到的可能问题:

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

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

于 2013-02-17T00:52:24.000 回答
0

您正在将文件重命名到原始文件所在的同一文件夹,从而导致无限循环。您重命名为04.png4.png但由于您正在迭代文件夹中的所有文件,因此在某些时候您将迭代到“新”4.png文件(在您的 smaple 中,在第 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);

`

于 2013-02-17T00:52:55.427 回答