3

I need to find the size of a file or a directory whatever given in the commandline using stat(). It works fine for the files (both relative and absolute paths) but when I give a directory, it always returns the size as 512 or 1024.

If I print the files in the directory it goes as follows :

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

but only the new and new.c files are actually in there. For this, the size is returned as 512 even if I place more files in the directory. Here s my code fragment:

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()");
    }
}

Where did I go wrong???

here is my request, reply structure:

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

I run it in gcc compiler in unix os.

4

3 回答 3

9

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

于 2012-09-02T22:43:29.230 回答
1

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

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

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

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

于 2012-09-03T01:29:23.687 回答
0

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

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

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

查看fstat/stat上的手册页

于 2012-09-02T22:38:59.433 回答