免费注册 查看新帖 |

Chinaunix

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

[C++] readdir读取目录的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-10 11:16 |只看该作者 |倒序浏览
5可用积分
用readdir读取某个目录,如果该目录不断有文件生成 则一直不返回NULL

有没有办法让程序只处理opendir时的文件而不处理后来新加的?

目录不能加锁

最佳答案

查看完整内容

getdirentries() 可以一次读取很长的内容

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
2 [报告]
发表于 2009-05-10 11:16 |只看该作者
getdirentries() 可以一次读取很长的内容

论坛徽章:
0
3 [报告]
发表于 2009-05-10 13:52 |只看该作者
你自己做各快照不就可以了

论坛徽章:
0
4 [报告]
发表于 2009-05-10 14:36 |只看该作者
怎么做快照呢?

  1. int my_find(const std::string& dirname,
  2.                            const std::string& fileRegular,
  3.                            std::vector<std::string>& vecFileNames)
  4. {
  5.         DIR *d;
  6.         struct  dirent *drt;
  7.         if ((d = opendir(dirname.c_str())) == NULL)
  8.         {
  9.                 std::cout << "open dir " << dirname << "err" << std::endl;
  10.                 return 1;
  11.         }
  12.         while ((drt = readdir(d)) != NULL)
  13.         {
  14.                 if ((strcmp( drt->d_name, "." ) != 0) && (strcmp( drt->d_name, ".." ) != 0))
  15.                 {
  16.                         char szTempDir[MAX_PATHH] = { 0 };
  17.                         sprintf(szTempDir, "%s/%s", dirname.c_str(), drt->d_name);
  18.                         struct stat buf;
  19.                         stat(szTempDir, &buf);

  20.                         if (S_ISDIR(buf.st_mode))
  21.                         {
  22.                                 //如果是目录,递归调用
  23.                                 my_find(szTempDir, fileRegular, vecFileNames);   
  24.                         }
  25.                         else
  26.                         {   
  27.                                 std::string tmpFileName = szTempDir;
  28.                                 if (tmpFileName.find(fileRegular) != std::string::npos)
  29.                                         vecFileNames.push_back(szTempDir);   
  30.                         }      
  31.                 }
  32.         }
  33.         closedir(d);

  34.         return 0;
  35. }

  36. int main(int argc, char *argv[])
  37. {
  38.         if (argc != 3) return 0;

  39.         std::string findedFiles = argv[2];
  40.         std::vector<std::string> vecSrcFileNames;
  41.         my_find(argv[1], findedFiles, vecSrcFileNames);
  42.         int fileNum = static_cast<int>(vecSrcFileNames.size());

  43.                
  44.         std::cout << "file number : " << fileNum << std::endl;
  45.         std::vector<std::string>::iterator it = vecSrcFileNames.begin();
  46.         for (; it != vecSrcFileNames.end(); ++it)
  47.                 std::cout << *it << std::endl;

  48.         return fileNum;
  49. }

复制代码


这是我的测试程序 单纯查某个目录下的文件没有问题 但如果该目录不断有程序进行创建删除文件的话就有时会找重复了

论坛徽章:
0
5 [报告]
发表于 2009-05-10 14:54 |只看该作者

这是测试脚本

test.sh


  1. #! /bin/ksh

  2. sh touch.sh  `work`   2>/dev/null &
  3. echo | awk '
  4. {
  5.         for (i = 0; i <= 250; i++)
  6.         {
  7.                 system("./a.out `work` ZH_46064_906_20080900_SPLIT22 > a.out.log"i" &");
  8.         }

  9. }'
复制代码


touch.sh

  1. #!/bin/ksh

  2. if [ $# -ne 1 ]
  3. then
  4.         exit;
  5. fi

  6. echo | awk '{
  7. for(i = 0; i < 10000; i++)
  8. {
  9.         system("rm  '$1'/"i" &");
  10. }
  11. for(i = 0; i < 10000; i++)
  12. {
  13.         system("touch '$1'/"i" &");
  14. }
  15. }'
复制代码

论坛徽章:
0
6 [报告]
发表于 2009-05-10 15:03 |只看该作者
用ls就能做快照阿,很多包管理器都是拿ls做快照的

论坛徽章:
0
7 [报告]
发表于 2009-05-10 15:09 |只看该作者
不知道ls又是如何处理这种情况呢?

论坛徽章:
0
8 [报告]
发表于 2009-05-10 15:37 |只看该作者
ls -R,
一般的软件包都包含一个叫做ls-R的文件,用来说明该软件包包含哪些文件,如果不想使用外部命令,可以参考下ls的实现

论坛徽章:
0
9 [报告]
发表于 2009-05-10 17:19 |只看该作者
发现ls也会出问题

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
10 [报告]
发表于 2009-05-10 18:09 |只看该作者

回复 #9 皇家救星 的帖子

因为 ls 也是用的readdir(), 比较靠普的就是用getdirentries() 一次读取很大一块, 尽量快速读完.

btw: 什么需求?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP