免费注册 查看新帖 |

Chinaunix

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

[C++] 利用c++,如何知道目录下所有文件的大小(含子目录) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-11 10:09 |只看该作者 |倒序浏览
如何知道目录下所有文件的大小(含子目录)
类似于du -k 命令,获得目录中所有文件的大小
谢谢

论坛徽章:
0
2 [报告]
发表于 2004-02-11 12:44 |只看该作者

利用c++,如何知道目录下所有文件的大小(含子目录)

unsigned long dudir(char *dirname) {
  unsigned long dirsize = 0;
  DIR *dp;
  struct dirent *ep;

  dp = opendir (dirname);
  if (dp != NULL) {
      while (ep = readdir (dp)) {
          调用stat分析ep->;d_namestat是正规文件还是目录
          如果ep->;d_name此文件是目录则递归调用此函数
          dirsize += dudir(ep->;d_name);
           如果是正规文件则使用stat计算长度
          dirsize += 文件长度
        如果是其他类型则不计算?
      }
      (void) closedir (dp);
    }


   return dirsize;
}
可能需要更严谨些吧。

论坛徽章:
0
3 [报告]
发表于 2004-02-11 14:04 |只看该作者

利用c++,如何知道目录下所有文件的大小(含子目录)

以下是我在SOLARIS系统下测试成功的代码,类似于ls命令的功能。

  1. #include <iostream>;
  2. using namespace std;

  3. #include <sys/types.h>;
  4. #include <sys/stat.h>;
  5. #include <dirent.h>;
  6. #include <time.h>;

  7. int main(int argc, char* argv[])
  8. {
  9.         DIR *dp;
  10.         struct dirent *dirp;
  11.        
  12.         if (argc == 1)
  13.                 dp = opendir( "." );
  14.         else
  15.                 dp = opendir( argv[1] );

  16.         while ( (dirp = readdir(dp)) != NULL) {

  17.                 struct stat st;
  18.                 char fn[200];
  19.                 if (argc == 1)
  20.                         strcpy(fn, dirp->;d_name);
  21.                 else
  22.                         sprintf(fn, "%s//%s", argv[1], dirp->;d_name);

  23.                 if( stat(fn, &st) < 0) {
  24.                         cout << "error" << endl;
  25.                         continue;
  26.                 }
  27.                
  28.                 if S_ISREG(st.st_mode) {
  29.                         cout << "-";
  30.                 }else if S_ISDIR(st.st_mode) {
  31.                         cout << "D";
  32.                 }else if S_ISCHR(st.st_mode) {
  33.                         cout << "C";
  34.                 }else if S_ISBLK(st.st_mode) {
  35.                         cout << "B";
  36.                 }else if S_ISFIFO(st.st_mode) {
  37.                         cout << "P";
  38.                 }else if S_ISLNK(st.st_mode) {
  39.                         cout << "L";
  40.                 }else if S_ISSOCK(st.st_mode) {
  41.                         cout << "S";
  42.                 } else
  43.                         cout << "?";

  44.                 if (st.st_mode & S_IRUSR)
  45.                         cout << "r";
  46.                 else
  47.                         cout << "-";
  48.                 if (st.st_mode & S_IWUSR)
  49.                         cout << "w";
  50.                 else
  51.                         cout << "-";
  52.                 if (st.st_mode & S_IXUSR)
  53.                         cout << "x";
  54.                 else
  55.                         cout << "-";

  56.                 if (st.st_mode & S_IRGRP)
  57.                         cout << "r";
  58.                 else
  59.                         cout << "-";
  60.                 if (st.st_mode & S_IWGRP)
  61.                         cout << "w";
  62.                 else
  63.                         cout << "-";
  64.                 if (st.st_mode & S_IXGRP)
  65.                         cout << "x";
  66.                 else
  67.                         cout << "-";

  68.                 if (st.st_mode & S_IROTH)
  69.                         cout << "r";
  70.                 else
  71.                         cout << "-";
  72.                 if (st.st_mode & S_IWOTH)
  73.                         cout << "w";
  74.                 else
  75.                         cout << "-";
  76.                 if (st.st_mode & S_IXOTH)
  77.                         cout << "x";
  78.                 else
  79.                         cout << "-";

  80.                 cout << " " << ctime( &st.st_mtime ) << " ";
  81.                 cout << " " << st.st_mtime;
  82.                 cout << " " << st.st_uid << ":" << st.st_gid;
  83.        
  84.                 cout << " ";
  85.                 cout.width(8);
  86.                 cout << st.st_size;
  87.                 cout << " " << dirp->;d_name << endl;
  88.         }

  89.         closedir(dp);
  90. }

复制代码

论坛徽章:
0
4 [报告]
发表于 2004-02-11 14:16 |只看该作者

利用c++,如何知道目录下所有文件的大小(含子目录)

用ftw吧,比这简单的多!

论坛徽章:
0
5 [报告]
发表于 2004-02-12 09:43 |只看该作者

利用c++,如何知道目录下所有文件的大小(含子目录)

ftw是什么哦,能说清楚一点么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP