免费注册 查看新帖 |

Chinaunix

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

stat函数无法获取到目录下文件大小 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-15 14:38 |只看该作者 |倒序浏览
想实现读取一目录,然后统计出该目录个文件、目录等的大小,代码实现如下:statbuf.st_size无法获取到正确的值。
比如我在/home/test目录下创建了如下代码文件dir.c,读取目录为/home/test/haha目录(该目录下有a/b/c三个空文件)
./dir haha
或者./dir /home/test/haha 结果都一样:

a
file type is:1073790144
b
file type is:1073790144
c
file type is:1073790144

初学linux下的c编程,欠缺很多知识,实在找不到问题在哪,请各路高手帮忙看下,急~~
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#define BUFSIZE 512
#define PERM 0755

main(int argc,char **argv)
{
   DIR *dp;
   struct dirent *dirp;
   struct stat  statbuf;
   const char *dirname;
   char tmp[256],size[256];
   int size_count;
   dp=opendir(argv[1]); /*打开目录*/
   if(dp==NULL)
     printf("No such diretory!");
   if(dp!=NULL)
   {
          size_count=0;
      while((dirp=readdir(dp))!=NULL) /*判断目录不为空时,拷贝目录下的文件到指定文件夹中*/
      {
         if(strcmp(dirp->d_name,".")==0||strcmp(dirp->d_name,"..")==0)
            continue;
         dirname=dirp->d_name;
         sprintf(tmp,"cp -r %s/%s dir",argv[1],dirname);
         system(tmp);
         printf("%s\n",dirp->d_name);
         stat(dirp->d_name,&sizebuf);
         /*size_count=size_count + statbuf.st_size;*/
         printf("file type is:%ld\n",statbuf.st_size);/*该步获取到的值一直是错的*/
       }
    }
   closedir(dp);
}

论坛徽章:
0
2 [报告]
发表于 2008-08-15 16:57 |只看该作者
这么冷清啊,都没人回。
问题解决了,换种方式实现文件的统计,直接用system调用du命令,是种偷懒的办法,不过一样达到目的,何乐而不为?代码贴上:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>

/*copy directory to another directory*/

main(int argc,char **argv)
{
   DIR *dp,*dp1;
   struct dirent *dirp;
   struct stat  sizebuf;
   const char *dirname;
   char tmp[256],tmp1[256];
   
   if(argc!=3)  /*判断提交的参数*/
   {
            printf("Usage is: ./copydir directory1 directory2\n");
            exit (1);           
           }
   dp=opendir(argv[1]); /*打开拷贝源目录*/
   dp1=opendir(argv[2]);/*打开拷贝目标目录*/
   if(dp==NULL)/*如果源目录不存在,则提示没有该目录,并退出*/
   {
     printf("No such diretory!\n");
     exit (1);
    }
    if(dp1==NULL)/*如果目标目录不存在,提示用户先创建该目录,并退出*/
   {
            printf("No such diretory!Please create it first\n");
     exit (1);
           }
   if(dp!=NULL)
   {  
      while((dirp=readdir(dp))!=NULL) /*判断目录不为空时,循环拷贝目录下的文件到指定文件夹中*/
      {
         if(strcmp(dirp->d_name,".")==0||strcmp(dirp->d_name,"..")==0)
            continue;
         dirname=dirp->d_name;
         sprintf(tmp,"cp -dr %s/%s %s",argv[1],dirname,argv[2]);
         sprintf(tmp1,"du -ah %s | tee -a cp_info.txt",argv[2]);
         system(tmp);
         system(tmp1);
       }
    }
   closedir(dp);
   closedir(dp1);
}

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2008-08-15 19:27 |只看该作者
原帖由 bug_no2 于 2008-8-15 16:57 发表
这么冷清啊,都没人回。
问题解决了,换种方式实现文件的统计,直接用system调用du命令,是种偷懒的办法,不过一样达到目的,何乐而不为?代码贴上:

若是要解决这个问题,那么这个方法也没什么。但若是作为学习,我建议你还是搞清楚为嘛你的第一次尝试不成功。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2008-08-15 19:36 |只看该作者
原帖由 bug_no2 于 2008-8-15 14:38 发表
想实现读取一目录,然后统计出该目录个文件、目录等的大小,代码实现如下:statbuf.st_size无法获取到正确的值。
比如我在/home/test目录下创建了如下代码文件dir.c,读取目录为/home/test/haha目录(该目录下 ...

首先要搞清楚的是,在 Linux 下,目录中究竟保存的是什么?文件本身么?不是。

在 Linux 下,目录保存的实际是"文件名"+inode。inode 是到文件系统的元数据(文件的类型,大小,所有者,权限,等等)的索引。文件系统就好比一个大仓库,文件就好比保存在该仓库中的各种货物,而目录呢,就好比仓库门口的货物清单(及其在仓库中的位置等信息)。显然在清单里面并没有包含货物本身,而你获取清单本身的大小(就如同你获取目录的大小一样)同样无法获取清单里面所列物品的大小。

论坛徽章:
0
5 [报告]
发表于 2008-08-16 07:23 |只看该作者
原帖由 bug_no2 于 2008-8-15 14:38 发表
想实现读取一目录,然后统计出该目录个文件、目录等的大小,代码实现如下:statbuf.st_size无法获取到正确的值。
比如我在/home/test目录下创建了如下代码文件dir.c,读取目录为/home/test/haha目录(该目录下 ...

都用system( "du" )了,为啥不全用shell实现

论坛徽章:
0
6 [报告]
发表于 2008-08-16 21:24 |只看该作者
你要统计文件和目录的大小,为什么要把他们都拷贝到dir里呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP