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

stat()在c中给出了错误的目录大小,c,struct,message,stat,reply,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){ re

我需要使用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操作系统的gcc编译器中运行它。

很抱歉,我第一次错过了它,stat只给出了文件的大小,没有给出目录:

这些函数返回有关文件的信息。文件本身不需要任何权限,但在stat()和lstat()的情况下,指向该文件的路径中的所有目录都需要-execute(search)权限

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

查看目录上的手册页

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

是的。opendir()+readdir()/stat()上的循环将为您提供文件/目录大小,您可以将这些大小相加以得到总数。如果您有子目录,您还必须循环这些子目录和其中的文件

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

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

然后,您可以读取du_res_文件(假设已成功创建)以获得答案。这将一次性给出目录+子目录+文件的大小。

什么操作系统/编译器?另外,这个请求/应答结构是什么?如果在目录中放置足够的文件,它将增长到512或1024字节以上。例如,如果您添加120个文件名,其中每个文件名包含10个或更多字符,那么您可以合理地预期文件名的大小大于1024字节。然后我想我需要检查它是否是一个目录,如果是,那么我需要分别对每个文件和stat()执行opendir()和readdir()操作。我不知道如何在c程序中使用du。这是一个unix命令,用于查找当前目录的磁盘使用情况。是的,如果它是一个目录,则需要对其中的每个文件执行
opendir()
readdir()
stat()
。我不一定推荐在C程序中使用
du
。。。这只是一个采用这种方法的程序示例,但它(通常)给出了目录的大小。Unix目录是一个特殊文件。例如,我的主目录的大小为4096字节。(这与它“包含”的任何文件的大小没有直接关系。)