directory_iterator file_iter重命名文件夹中的文件

时间:2012-06-29 12:39:07

标签: c++ file-rename boost-filesystem

我想重命名目录中的文件。目录中有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()));

                    }
                }
            }
        }
    }

} }

1 个答案:

答案 0 :(得分:2)

Boost的directory_iterator实现可能会因重命名目录列表中的文件而感到困惑。

来自文档:

  

警告:如果在构建目录的directory_iterator之后从目录中删除或添加了文件或子目录,则未指定后续递增迭代器是否会永远导致迭代器的值为删除或添加的目录条目。

我建议分两个阶段进行尝试。在第一阶段,使用您现在拥有的代码构建vector<pair<string, string> >而不是重命名文件。然后,一旦你扫描了目录,它应该只是迭代执行实际重命名的列表。