2

有没有人有这个问题?使用 recursive_directory_iterator 搜索分区时,到达末尾时会崩溃。
我在 Visual Studio 2008 中使用 boost 1.39 得到这个,但也在家里使用 MinGW 和 boost 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;
}

编辑:
我看到它最后没有崩溃,但是当它到达系统卷信息时

4

3 回答 3

4

Windows 不允许您查看目录“系统卷信息”。因此,在“系统卷信息”上释放 recursive_directory_iterator 是一个坏主意。

编辑:您可以使用 recursive_directory_iterator::no_push() 解决问题。来自 Boost 文档:

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 是一个我想跳过的目录) it.no_push(); ++它;

于 2011-07-04T16:51:52.590 回答
0

定义 HDIR_DEEP_ITERATOR_BASE boost::filesystem::recursive_directory_iterator

类 dir_deep_iterator:公共 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 回答