directory_iterator file_iter для переименования файлов в папке

Я хотел переименовать файлы в каталоге. В каталоге 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()));

                    }
                }
            }
        }
    }

} }


person cameo    schedule 29.06.2012    source источник
comment
Вы пытались отладить его, чтобы увидеть, в какой момент и почему он падает? также актерский состав (int(*)(int))std::toupper кажется опасным. char не int.   -  person tehlexx    schedule 29.06.2012
comment
На самом деле он не ломается. Когда фотографий меньше 31. Переименование работает нормально. Например: если имя 1-й папки равно «1», то имена файлов переименовываются в 1_133422394789.jpg. думаю, что эта проблема как-то связана с 'end_iter'   -  person cameo    schedule 29.06.2012
comment
но как только их больше 31 он вылетает? Вы пробовали использовать разные имена файлов/папок? может быть, дело не в количестве, а в именах файлов. Может быть, вы могли бы опубликовать пример папки/файла, где он работает, и тот, где он не работает.   -  person tehlexx    schedule 29.06.2012
comment
Да, я пробовал все эти возможности. Разные папки, разные изображения/файлы... но за пределами определенного числа алгоритм не работает. Я понял, что end_iter не определяет последний файл. Таким образом, весь набор файлов в этом каталоге снова и снова переименовывается.   -  person cameo    schedule 29.06.2012


Ответы (1)


Вполне вероятно, что реализация Boost directory_iterator запуталась, когда вы переименовали файлы, которые находятся в списке каталогов.

Из документов:

Предупреждение. Если файл или подкаталог удаляется из каталога или добавляется в него после создания для каталога итератора каталога, не указано, приведет ли когда-либо последующее увеличение итератора к итератор, значением которого является удаленная или добавленная запись каталога.

Рекомендую попробовать в два этапа. На первом этапе используйте код, который у вас есть, для создания vector<pair<string, string> > вместо переименования файла. Затем, после того как вы просканировали каталог, вам нужно будет просто пройтись по списку, выполняя фактические переименования.

person leedm777    schedule 29.06.2012
comment
Да, Дэйв, спасибо... я думаю, что directory_iterator запутался. «Документ» объясняет путаницу, которая у меня возникла при использовании end_iterator...! - person cameo; 02.07.2012