4.12 st_size、st_blksize和st_blocks成员-文件尺寸

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的结果。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值