[置顶] unix环境高级编程-文件长度与截断

4.12 文件长度

stat 的结构成员st_size表示以字节为单位的文件长度。此字段只对普通文件、目录文件和符号链接有意义。

对于普通文件,其文件的长度可以是0,在读此文件的时候,将得到文件结束指示。

对于目录,文件长度通常是一个数的倍数,

对于符号链接,文件长度是文件明中的世界字节数。

 

现今,大多数UNIX系统提供的字段st_blksize和st_blocks。其中第一个是对文件I/O较为合适的的块长度。第二个是所分配的实际512字节块的数量。在3.9节中我们提到过,在读操作的时候,设这st_blksize时候,效率是最高的。

 

文件中的空洞。

在3.6节我们提到过文件空洞,由于设置的偏移量大于了文件的实际长度,并且写了数据,就会造成文件空洞现象。

书中使用了 ls -l 命令对一个文件测试 大小是8M,但是使用du -a 的时候,显示该文件使用了磁盘空间总量的272个512字节块。很明显此文件有很多空洞。

那么如果使用实用程序复制这种文件,那么所有这些空洞都会被填满,其中有实际数据字节皆天蝎为0

 

4.13 文件截短

有时候我们需要在文件尾端处截取一些数据以缩短文件。讲一个文件清空为0.是一个特例。在打开文件时候使用O_TRUNC标志就可以做到这一点。

 

#include <unistd.h>

int truncate(const char* pathname,off_t length)

int ftruncate(int filedes,off_t length);

若成功则返回0,出错则返回-1

查看GNUC手册。

int truncate (const char *filename, off t length) [Function]
The truncate function changes the size of filename to length. If length is shorter
than the previous length, data at the end will be lost. The file must be writable by
the user to perform this operation.
If length is longer, holes will be added to the end. However, some systems do not
support this feature and will leave the file unchanged.
When the source file is compiled with _FILE_OFFSET_BITS == 64 the truncate function
is in fact truncate64 and the type off_t has 64 bits which makes it possible to
handle files up to 263 bytes in length.
The return value is 0 for success, or

你可能感兴趣的:(编程,unix,function,File,测试,磁盘)