Является ли boost::filesystem::directory_iterator недействительным при удалении?

Я перебираю каталог, и когда элемент соответствует некоторым критериям, я удаляю его. Могу ли я сделать это безопасно из цикла или мне нужно сохранить пути в массиве и удалить их позже?

Я не нашел соответствующей информации в boost::filesystem docs .


person eudoxos    schedule 22.11.2012    source источник


Ответы (2)


Цитирование первой части примечания, прикрепленного к документы boost::filesystem::directory_iterator (выделено мной):

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

Мне становится ясно, что повторение каталога с целью удаления файлов является официально поддерживаемым вариантом использования и, следовательно, не сделает итератор недействительным. Кроме того, цитируя вторую часть этой заметки:

Если файл удаляется из каталога или добавляется в каталог после построения итератора directory_iterator для каталога, не указано, приведет ли когда-либо последующее увеличение итератора к итератору, значением которого является удаленная или добавленная запись каталога. См. ISO/IEC 9945 readdir_r().

Это очень конкретное утверждение о том, появится ли удаленный файл при переборе каталога. Опять же, я понимаю, что сам процесс итерации остается в силе в любом случае.

Обратите внимание, что ISO/IEC 9945 имеет аналогичную формулировку.

person jlh    schedule 22.08.2013
comment
У меня только что был случай, когда я удалил файлы во время итерации с boost::filesystem::recursive_directory_iterator (обратите внимание на recursive), и итерация не удалась. - person hudac; 13.10.2020

В Windows это правда, но я нашел Ubuntu, в которой итератор становится недействительным после удаления, поэтому при следующем доступе возникает исключение.

Итак, я закончил тем, что использовал что-то вроде этого:

    recursive_directory_iterator end;
    for (recursive_directory_iterator itr(folderPath); itr != end; )
    {
        path filePath = *itr++;
        if (is_regular_file(filePath) && filePath.string().find(filter) != std::string::npos)
        {
            if (remove(filePath))
            {
                removedFilesCounter++;
            }
        }
    }
person kenny mccormick    schedule 08.01.2018