struct stat结构(参考《4.2 stat函数》)中的一些数据成员可以反应文件所占用的存储空间以及所在的文件系统参数。其中常用的有:st_blksize(文件的块大小)、st_blocks(文件包含的块数)和st_size(文件大小字节数)。
所谓块大小就是文件系统在给文件分配空间时的最小单位。文件系统并不是以字节为单位给具体文件分配存储空间,都是以一个合适大小(例如512字节等)为单位进行“发放”,尽管文件最后一块没用完,也会分配出去。所以文件实际占用空间=st_blocksize * st_blocks。而文件实际大小由st_size来确定。大部分情况下st_size并不等于st_blocksize * st_blocks。
要读取文件全部内容应该根据st_size来读,而不是根据st_blocksize * st_blocks来读。
实例 x.4.12.1.c
#include <fcntl.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char pathname[] = "/tmp/myfile";
struct stat buf;
if (stat(pathname, &buf) == -1)
printf("stat error for %s\n", pathname);
else
printf("size:%d\nblocksize:%d\nblocks:%d\nused size:%d\n",
buf.st_size, buf.st_blksize, buf.st_blocks, buf.st_blksize * buf.st_blocks);
exit(0);
}
编译与执行:
[root@localhost unixc]# echo "123456789" > /tmp/myfile
[root@localhost unixc]# ls -l /tmp/myfile
----r-S--T. 2 root root 10 Nov 4 12:02 /tmp/myfile
[root@localhost unixc]# cc x.4.12.1.c
[root@localhost unixc]# ./a.out
size:10
blocksize:4096
blocks:8
used size:32768
[root@localhost unixc]#
分析:echo进去的是9个字符[123456789],但显示的szie是10,可能是因为重定向创建文件时自动在文件最后加上一个文件结束字符EOF的结果。