Boost.Filesystem вылетает - PullRequest
       25

Boost.Filesystem вылетает

1 голос
/ 09 июня 2011

У кого-нибудь была эта проблема? При поиске раздела с помощью recursive_directory_iterator, когда он достигает конца, происходит сбой.
Я получаю это в Visual Studio 2008 с надстройкой 1.39, а также дома, используя MinGW с надписью 1.46. Я не думаю, что я делаю что-то не так:

#include "stdafx.h"
#include <iostream>
#include <boost/filesystem.hpp>
using namespace std;




int _tmain(int argc, _TCHAR* argv[])
{
    boost::filesystem::path musicPaths("d:\\");
    for(boost::filesystem::recursive_directory_iterator it(musicPaths); it != boost::filesystem::recursive_directory_iterator(); ++it)
    {
        string strToFind = ".mp3";
        boost::filesystem::path dummypath = it->path().filename();
        string str = dummypath.string();
        if(str.find(strToFind) != -1)
        {
            cout << str << endl;
        }
    }
    return 0;
}

EDIT:
Я вижу, что в конце не происходит сбой, но когда он достигает информации о томе системы

Ответы [ 3 ]

3 голосов
/ 09 июня 2011

Windows не позволяет заглянуть внутрь каталога «Информация о томе системы».Поэтому использование recursive_directory_iterator в разделе «Информация о системных томах» - плохая идея.

Редактировать: Вы можете решить проблему с помощью recursive_directory_iterator :: no_push ().Из The Boost docs:

void no_push(bool value=true);

    Requires: *this != recursive_directory_iterator().

    Postcondition: no_push_pending() == value.

    Throws: Nothing.

    [Note: no_push() is used to prevent unwanted recursion into a directory. --end note]
1 голос
/ 04 июля 2011

Вы должны вызвать no_push () перед переходом к следующему итератору.

Псевдокод:

if (* это каталог, который я хочу пропустить) it.no_push ();++ это;

0 голосов
/ 31 августа 2013

определить HDIR_DEEP_ITERATOR_BASE boost :: filesystem :: recursive_directory_iterator

class dir_deep_iterator: public HDIR_DEEP_ITERATOR_BASE

{

общественность:

.....

dir_deep_iterator & operator ++()

{

    try

    {

        return (dir_deep_iterator &)HDIR_DEEP_ITERATOR_BASE::operator ++();

    }

    catch(...)

    {

        //有些特殊的目录无法打开,比如"System Volume Information",导致抛出异常

        no_push(true);

        return (dir_deep_iterator &)HDIR_DEEP_ITERATOR_BASE::operator ++();

    }

}

....

}

...