Вопрос

Так что я написал небольшую программу, чтобы попробовать повысить файловую систему. Моя программа напишет, сколько файлов есть в текущем пути, а затем имена файлов. Вот моя программа:

#include <iostream>
#include <boost/filesystem.hpp>

using namespace boost::filesystem;

int main(){
    directory_iterator start = directory_iterator(current_path());
    directory_iterator di = start;
    int count;
    for (count = 0; di != directory_iterator(); ++di, ++count);
    std::cout << std::endl << "total number of files: " << count << std::endl;
    di = start;
    for (; di != directory_iterator(); ++di){
        std::cout << *di << std::endl;
    }
    return 0;
}
.

Файлы, существующие программа .exe, .ilk и .pdb
Однако я получаю следующий вывод (весь путь оставлен для краткости):

$ program.exe

Общее количество файлов: 3
[..] / program.pdb
Ошибка утверждения: m_imp-> m_handle!= 0 && "Внутренняя программа Ошибка", Файл C: \ Program Files \ Boost \ Boost_1_44 \ Boost \ FileSystem \ v2 \ options.hpp, строка 1001

Если я сделаю новый Directory_iterator вместо этого работает нормально:

di = start;
// .. becomes ..
di = directory_iterator(current_path());
.

Я заметил a Подобный вопрос Я понятия не имею, что они ссылаются или если это та же проблема.

Вопрос: Почему я не могу сохранить устаревку, а затем использовать это, чтобы перемотать свой итератор?

Это было полезно?

Решение

Это та же проблема.

Итератор каталога - это один перевал итератор.Вы не можете сохранить копию и пройти второй проход.Каждый раз, когда вы увеличиваете итератор, вы получаете следующую запись, но вы не можете уменьшить его, и вы не можете вернуться назад и начать все, даже если вы сохранили копию отправной точки.

Если вы хотите пройти дважды, вам нужно создать другой итератор (и риск того, что количество файлов изменилось).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top