stat()在c中给出错误的目录大小

时间:2012-09-02 22:30:52

标签: c struct message stat reply

我需要使用stat()查找命令行中给出的文件或目录的大小。它适用于文件(相对路径和绝对路径),但是当我给出一个目录时,它总是返回512或1024的大小。

如果我打印目录中的文件,则按如下方式进行:

 Name : .
 Name : ..
 Name : new
 Name : new.c

但实际上只有new和new.c文件。为此,即使我在目录中放置了更多文件,大小也会返回512。 这是我的代码片段:

if (stat(request.data,&st)>=0){
        request.msgType = (short)0xfe21;
        printf("\n Size : %ld\n",st.st_size);
        sprintf(reply.data,"%ld",st.st_size);
        reply.dataLen = strlen(reply.data);
    }
    else{
        perror("\n Stat()");
    }
}

我哪里出错???

这是我的请求,回复结构:

 struct message{
        unsigned short msgType;
        unsigned int offset;
        unsigned int serverDelay;
        unsigned int dataLen;
        char data[100];
    };
struct message request,reply;

我在unix os中使用gcc编译器运行它。

3 个答案:

答案 0 :(得分:7)

目录上的

stat()不会返回其中文件大小的总和。 size字段表示目录条目占用的空间,它取决于几个因素。如果您想知道特定目录下的所有文件占用了多少空间,则必须递归树,累加所有文件占用的空间。这就是像du这样的工具的工作方式。

答案 1 :(得分:1)

是。 readdir()/ stat()上的opendir()+循环将为您提供文件/目录大小,您可以将它们相加以获得总计。如果你有子目录,你还必须循环它们及其中的文件。

要使用du,您可以使用system()函数。这只会将结果代码返回给调用程序,因此您可以将结果保存到文件中,然后读取文件。代码就像是,

system("du -sb dirname > du_res_file");

然后你可以读取文件du_res_file(假设它已经成功创建)来得到你的答案。这将一次性给出目录+子目录+文件的大小。

答案 2 :(得分:0)

对不起,我第一次错过了,stat只给出了文件的大小,而不是目录:

  

这些函数返回有关文件的信息。文件本身不需要权限,但是在stat()和lstat()的情况下 - 对于通向该文件的路径中的所有目录都需要执行(搜索)权限。

     

st_size字段以字节为单位给出文件的大小(如果是常规文件或符号链接)。符号链接的大小是它包含的路径名的长度,没有终止空字节。

查看fstat/stat

上的手册页