0

ディレクトリ内のファイルの名前を変更したかったのですが、ディレクトリ内に 52 個のフォルダーがあります。各フォルダーには異なる名前があり、それぞれに約 40 個のファイルがあります。特定のフォルダーの名前を抽出し、その名前をその特定のフォルダー内のファイルの名前に付けたいと思いました。各フォルダーに 31 個以下のファイルしかない場合は、正常に機能しました。しかし、特定のフォルダー内のファイル数が 31 を超えると、私が作成した名前変更アルゴリズムは失敗しました。ファイルが増えるとクラッシュする理由がわかりません。理由がわかったら教えてください...!私はコードを添付しています:

int main( int argc, char** argv ){
directory_iterator end_iter;
directory_iterator file_itr;

string inputName;
string checkName;
inputName.assign(argv[1]);


if (is_directory(inputName))
{

    for (directory_iterator dir_itr(inputName); dir_itr != end_iter; ++dir_itr)
    {
        if (is_directory(*dir_itr))
        {
            for (directory_iterator file_itr(*dir_itr); file_itr != end_iter; ++file_itr)
            {
                string folderName(dir_itr->path().filename().string());
                if (is_regular_file(*file_itr)) 
                {
                    std::string fileType = file_itr->path().extension().string();
                    std::transform(fileType.begin(), fileType.end(), fileType.begin(), (int(*)(int))std::toupper);
                    if (fileType == ".JPG" || fileType == ".JPEG" || fileType == ".JPG" || fileType == ".PGM") 
                    {
                        string filename(file_itr->path().string());
                        string pathName(file_itr->path().parent_path().string());
                        string oldName(file_itr->path().filename().string());

                        cout << folderName << endl;
                        folderName += "_";
                        folderName += oldName;

                        string newPathName = pathName + "\\" + folderName;
                        cout << pathName <<"\\"<< folderName << endl;

                        //RENAMING function
                        rename(file_itr->path(), path(newPathName.c_str()));

                    }
                }
            }
        }
    }

} }

4

1 に答える 1

2

ディレクトリ リストにあるファイルの名前を変更すると、Boost のdirectory_iterator実装が混乱する可能性があります。

ドキュメントから:

警告: ディレクトリの directory_iterator の構築後に、ファイルまたはサブディレクトリがディレクトリから削除または追加された場合、その後のイテレータのインクリメントによって値が削除またはディレクトリエントリを追加しました。

2段階で試してみることをお勧めします。vector<pair<string, string> >最初のフェーズでは、ファイルの名前を変更する代わりに、現在のコードを使用してビルドします。次に、ディレクトリをスキャンしたら、実際の名前変更を実行するリストを反復処理するだけです。

于 2012-06-29T13:41:14.047 に答える