2

誰かがこの問題を抱えていましたか?recursive_directory_iteratorでパーティションを検索するときに、最後に到達するとクラッシュします。
これは、ブースト1.39のVisual Studio 2008で取得しますが、自宅でもブースト1.46のMinGWを使用して取得します。私は何か間違ったことをしているとは思わない:

#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;
}

編集:
最後にはクラッシュしませんが、システムボリューム情報に達したときにクラッシュすることがわかります

4

3 に答える 3

4

Windows では、「システム ボリューム情報」ディレクトリ内を参照することはできません。したがって、「システム ボリューム情報」で recursive_directory_iterator を解き放つことは悪い考えです。

編集: recursive_directory_iterator::no_push() で問題を解決できる場合があります。ブーストのドキュメントから:

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]
于 2011-06-09T08:51:18.053 に答える
1

次の反復子に移動する前に、no_push() を呼び出す必要があります。

擬似コード:

if(※スキップしたいディレクトリです) it.no_push(); ++それ;

于 2011-07-04T16:51:52.590 に答える
0

HDIR_DEEP_ITERATOR_BASE boost::filesystem::recursive_directory_iterator を定義する

クラス dir_deep_iterator : public HDIR_DEEP_ITERATOR_BASE

{

公衆:

.....

dir_deep_iterator & operator ++()

{

    try

    {

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

    }

    catch(...)

    {

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

        no_push(true);

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

    }

}

....

}

于 2013-08-31T15:49:36.363 に答える