1

タスクがフォルダー内のすべてのファイルの名前を変更する機能を取得しましたが、特定のファイルの名前を変更します: http://i.imgur.com/JjN8Qb2.png、同じ種類の「エラー」が10番目の数字ごとに発生し続けます以降。この「エラー」の原因は正確には何ですか?

関数への 2 つの引数は、フォルダーのパスと、最初のファイルの開始値です。

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

私が見る可能性のある問題:

  • ファイルの名前を変更すると、ファイルがアルゴリズムに 2 回渡されます。
  • 新しいファイル名を計算するアルゴリズムが間違っています。

このためのテストを簡単に作成できるはずです。これは、問題を修正したり、より具体的な質問を作成したりするのに役立ちます。それ以外には、重大な問題は見られませんが、変数のスコープを少し縮小すると、異なる反復が互いに影響を与えないようにするのに役立ちます。

于 2013-02-17T00:52:24.000 に答える
0

元のファイルと同じフォルダーにファイルの名前を変更すると、無限ループが発生します。名前を変更04.pngしまし4.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());

path(ループ外の)すべてのファイルの名前変更が完了したらwhile、フォルダーを削除し、「名前を変更」(移動)temp_pathして「パス:

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

`

于 2013-02-17T00:52:55.427 に答える