免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3074 | 回复: 5
打印 上一主题 下一主题

[C++] 怎样编写跳过禁止访问目录的程序。(大拿们,帮我看看我的程序应该怎样改!) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-19 16:02 |只看该作者 |倒序浏览
本帖最后由 wkx9dragon 于 2011-10-19 16:15 编辑

我的目的是遍历指定目录下所有文件,包括子目录,如果某个目录禁止访问,则跳过。
一直想找个能够处理禁止访问目录的,遍历函数,boost给我了希望,但是现在卡壳了,需要大家的帮忙,谢谢了。
//
namespace fs = boost::filesystem;
...
//
void pathList(const string& path, Container& result,unsigned long maxdepth){
        using namespace fs;
        try{
                fs::path p(path);
                if (p.empty())         return;
                if (fs::is_directory(p)) {
                        fs::recursive_directory_iterator end_iter;
                        fs::recursive_directory_iterator itr(p);
        label:               
                        while (itr != end_iter) {
                                result.push_back(itr->path().string());
                                if( fs::is_directory(*itr) ){
                                        try{
                                                fs::directory_iterator ditr(*itr);
                                        }
                                        catch( const filesystem_error& e){
                                                clog<<__LINE__<<":"<<e.what()<<"\n";
                                                itr.pop();
                                                clog<<__LINE__<<":"<<itr->path().string()<<"\n";
                                                goto label;
                                        }
                                }
                                if( itr.level() < maxdepth ) ++itr;
                        }
                }
        }
        catch( const filesystem_error& e){
                clog<<__LINE__<<":"<<e.what()<<"\n";
        }
}

论坛徽章:
0
2 [报告]
发表于 2011-10-19 16:05 |只看该作者
你是想访问禁止访问目录的内容,还是想跳过禁止访问目录?

论坛徽章:
0
3 [报告]
发表于 2011-10-19 16:14 |只看该作者
本帖最后由 wkx9dragon 于 2011-10-19 16:15 编辑

回复 2# yunccll


    我的目的是遍历指定目录下所有文件,包括子目录,如果某个目录禁止访问,则跳过

论坛徽章:
0
4 [报告]
发表于 2011-10-19 16:26 |只看该作者
你如果针对linux系统的话,可以使用int access(const char *pathname, int mode); 访问前,先判断一下是否有  权限。  
具体google或者  man access

论坛徽章:
0
5 [报告]
发表于 2011-10-19 16:28 |只看该作者
这个为啥用boost.filesystem, 这个module,需要编译boost.filesystem为二进制才能用的, 不是 header include就可以的,不够方便,呵呵!

论坛徽章:
0
6 [报告]
发表于 2011-10-20 00:03 |只看该作者
回复 4# yunccll
你的方法和操作系统相关性太大了,我用boost::filesystem 的目的就是跨平台。
//
这是一个不是方法的方法,虽然解决了这个问题,但是,这一类问题的解决还是没有解决。
void pathList(const string& path, Container& result,unsigned long maxdepth){
        using namespace fs;
        try{
                fs::path p(path);
                if (p.empty())         return;
                if (fs::is_directory(p)) {
                        fs::recursive_directory_iterator end_iter;
                        fs::recursive_directory_iterator itr(p);
                        while (itr != end_iter) {
                                result.push_back(itr->path().string());
                                if( fs::is_directory(*itr) ){
                                        try{
                                                fs::directory_iterator dir(*itr);
                                        }
                                        catch( const filesystem_error& e){
                                                clog<<__LINE__<<":"<<e.what()<<"\n";
                                                itr.no_push();
                                        }
                                }
                                if( itr.level() == maxdepth ) itr.no_push();
                                ++itr;
                        }
                }
        }
        catch( const filesystem_error& e){
                clog<<__LINE__<<":"<<e.what()<<"\n";
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP