Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с перебором файлов в каталоге 
:(
    Опции темы
admsasha
Дата 22.2.2018, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Есть вот такой код. Работает он в многопоточной программе. И иногда почему то возвращает список из меньшего количества файлов, чем на самом деле. Что может быть не так в коде ?

Код

std::vector<std::string> getListFiles(const std::string &folder,bool recursion){
    DIR *dp;
    struct dirent *DirEntry;
    struct stat filestat;
    std::vector<std::string> result;

    if( (dp = opendir(folder.c_str())) == NULL) {
        return result;
    }
    while((DirEntry = readdir(dp)) != NULL){
        if(!strcmp(".", DirEntry->d_name) || !strcmp("..", DirEntry->d_name)) continue;
        std::string filepath = folder + "/" + std::string(DirEntry->d_name,strlen(DirEntry->d_name));

        if (recursion==true){
            if (stat(filepath.c_str(), &filestat)) continue;
            if (S_ISDIR(filestat.st_mode)){
                std::vector<std::string> tmp = getListFiles(filepath,recursion);
                result.insert(result.end(),tmp.begin(),tmp.end());
                filepath.append("/");
            }
        }

        result.push_back(filepath);
    }
    closedir(dp);

    return result;
}

PM MAIL WWW ICQ Jabber   Вверх
xvr
Дата 22.2.2018, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



MT версию библиотек не забыли включить?

PS. Зачем эта жуткая помесь С и С++ ?


Это сообщение отредактировал(а) xvr - 22.2.2018, 09:33
PM MAIL   Вверх
admsasha
Дата 22.2.2018, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(xvr @  22.2.2018,  16:29 Найти цитируемый пост)
MT версию библиотек не забыли включить?
 Забыл. А какие надо линковать дополнительно ?



Цитата(xvr @  22.2.2018,  16:29 Найти цитируемый пост)
PS. Зачем эта жуткая помесь С и С++ ?
 Так получилось. Если вы про strcmp, то я просто не знаю как более удобнее можно на C++. 
PM MAIL WWW ICQ Jabber   Вверх
xvr
Дата 22.2.2018, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(admsasha @  22.2.2018,  09:35 Найти цитируемый пост)
 Забыл. А какие надо линковать дополнительно ?

Это зависит от платформы. Если у вас Linux, то ничего не надо, если Windows нужно поставить в свойствах проекта используемые библиотеки (C/C++ -> Code Generation -> Runtime library: Multi-treaded ...)

Цитата(admsasha @  22.2.2018,  09:35 Найти цитируемый пост)
Если вы про strcmp,

Нет, я про всё остальное. Сравните:

Код

std::vector<std::string> getListFiles(const std::string &folder,bool recursion){
    DIR *dp;
    std::vector<std::string> result;
    if( (dp = opendir(folder.c_str())) == NULL) {
        return result;
    }
    while(dirent *DirEntry = readdir(dp)){
        if(!strcmp(".", DirEntry->d_name) || !strcmp("..", DirEntry->d_name)) continue;
        std::string filepath = folder + "/" + DirEntry->d_name;
        if (recursion){
            struct stat filestat;
            if (stat(filepath.c_str(), &filestat)) continue;
            if (S_ISDIR(filestat.st_mode)){
                std::vector<std::string> tmp = getListFiles(filepath,true);
                result.insert(result.end(),tmp.begin(),tmp.end());
                filepath.append("/");
            }
        }
        result.push_back(filepath);
    }
    closedir(dp);
    return result;
}

Ну и readdir с сотоварищами поменять на directory_iterator (если компилятор позволит)

PM MAIL   Вверх
admsasha
Дата 22.2.2018, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 28.1.2005

Репутация: нет
Всего: 6



Цитата(xvr @  22.2.2018,  18:47 Найти цитируемый пост)
Это зависит от платформы. Если у вас Linux, то ничего не надо, если Windows нужно поставить в свойствах проекта используемые библиотеки (C/C++ -> Code Generation -> Runtime library: Multi-treaded ...)

Проблема как раз только под linux. Под windows не получил. У меня IDE Qt Creator


Цитата(xvr @  22.2.2018,  18:47 Найти цитируемый пост)
Ну и readdir с сотоварищами поменять на directory_iterator (если компилятор позволит)
 Спасибо, почитаю.
PM MAIL WWW ICQ Jabber   Вверх
xvr
Дата 22.2.2018, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(admsasha @  22.2.2018,  15:34 Найти цитируемый пост)
Проблема как раз только под linux.

Попробуйте readdir_r, может поможет

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1236 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.