文件长度和文件截短

转自  http://blog.csdn.net/todd911/article/details/12068105

1.文件长度

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

stat结构的st_blksize成员是对文件IO较合适的块长度,在介绍系统IO调用时,该值为4096B。

stat结构的st_blocks成员是所分配的实际512字节块数量。

实践:

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <sys/stat.h>
  3. int main(int argc, char * argv[]){
  4. struct stat buf;
  5. if(argc != 2){
  6. printf("you must specify one parameter.\n");
  7. return -1;
  8. }
  9. if(lstat(argv[1],&buf) < 0){
  10. perror("stat");
  11. return -1;
  12. }
  13. printf("st_size:%ld\n",buf.st_size);
  14. printf("st_blksize:%ld\n",buf.st_blksize);
  15. printf("st_blocks:%ld\n",buf.st_blocks);
  16. }

运行结果:

[email protected]:~/apue$ ./a.out a.out
st_size:7526
st_blksize:4096
st_blocks:16

[email protected]:~/apue$ ll a.out
-rwxrwxr-x 1 yan yan 7526 Jun 12 15:53 a.out*

文件大小:7526字节,文件块大小:4096字节,512块数量:16

如果是空洞文件,stat中保存的大小是多少呢?

下面是一个包含空洞的文件,10个字节+40960个字节空洞+10个字节。

[email protected]:~/apue$ ll a.txt
-rw------- 1 yan yan 40980 Jun 12 16:00 a.txt

[email protected]:~/apue$ du -h a.txt
8.0K    a.txt

执行上面的程序进行大小的测定:

[email protected]:~/apue$ ./a.out a.txt
st_size:40980
st_blksize:4096
st_blocks:16

虽然st_size是40980字节,但是st_blocks还是16(16*512=8192字节)

如果是符号链接文件,则stat保存的大小是多少呢?

下面是一个符号链接文件:

[email protected]:~/apue$ ll symblicfile
lrwxrwxrwx 1 yan yan 7 Jul 10 07:21 symblicfile -> desfile

执行上面的程序进行大小的测定:

[email protected]:~/apue$ ./a.out symblicfile
st_size:7
st_blksize:4096
st_blocks:0

文件大小是文件名desfile的长度,正好是7个字节。

2.文件截断

下面2个函数将现有的文件长度截短成指定的字节数:

[cpp] view plaincopy

  1. #include<unistd.h>
  2. int truncate(const char* pathname, off_t length);
  3. int ftruncate(int filedes, off_t length);

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

实践:

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. int main(void){
  5. if(truncate("a.txt",5)<0){
  6. perror("truncate");
  7. return -1;
  8. }
  9. int fd = -1;
  10. if((fd = open("b.txt",O_RDWR))<0){
  11. perror("open");
  12. return -1;
  13. }
  14. if(ftruncate(fd,8)<0){
  15. perror("ftruncate");
  16. return -1;
  17. }
  18. if(fd != -1){
  19. close(fd);
  20. }
  21. return 0;
  22. }

运行结果:

[email protected]:~/apue$ ll a.txt b.txt
-rw-rw-r-- 1 yan yan 10 Jul 10 07:11 a.txt
-rw-rw-r-- 1 yan yan 10 Jul 10 07:11 b.txt

[email protected]:~/apue$ ./a.out
[email protected]:~/apue$ ll a.txt b.txt
-rw-rw-r-- 1 yan yan 5 Jul 10 07:12 a.txt
-rw-rw-r-- 1 yan yan 8 Jul 10 07:12 b.txt

如果length的大小是负数呢?

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. int main(void){
  5. if(truncate("a.txt",-1)<0){
  6. perror("truncate");
  7. return -1;
  8. }
  9. return 0;
  10. }

运行结果:

[email protected]:~/apue$ ll a.txt
-rw-rw-r-- 1 yan yan 5 Jul 10 07:12 a.txt
[email protected]:~/apue$ ./a.out
truncate: Invalid argument

如果length的值大于文件的大小呢?

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. int main(void){
  5. if(truncate("a.txt",10)<0){
  6. perror("truncate");
  7. return -1;
  8. }
  9. return 0;
  10. }

运行结果:

[email protected]:~/apue$ ll a.txt
-rw-rw-r-- 1 yan yan 5 Jul 10 07:12 a.txt
[email protected]:~/apue$ ./a.out
[email protected]:~/apue$ ll a.txt
-rw-rw-r-- 1 yan yan 10 Jul 10 07:15 a.txt
[email protected]:~/apue$ od -c a.txt
0000000   1   2   3   4   5  \0  \0  \0  \0  \0
0000012

文件被自动填充为\0

时间: 2024-10-11 00:18:44

文件长度和文件截短的相关文章

合并流以及已知文件流长度和未知文件长度的文件流读取方法

项目中有一个这样的需求,上传文件的时候需要多张文件一起上传,而且每张文件都有自己的文件信息,因为文件信息需要匹配验证,在处理过程中需要传输流的时候前半段固定长度为文件信息,后半段是文件流,而且还是多张批量的情况,经过不断摸索最终想出一个方案:那就是采用合并流,示意图如下: 批次信息[256]+文件信息流1[1024]+文件流1+文件信息流2[1024]+文件流2+文件信息流3[1024]+文件流3--. 前面256是固定长度的一个流,里面是文件数量等信息,文件批量上传的时候就可以根据文件数量来循

ComicEnhancerPro 系列教程十八:JPG文件长度与质量

作者:马健邮箱:[email protected] 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十八:JPG文件长度与质量 众所周知,JPG是一种"有损"压缩格式,与PNG等无损压缩格式相比,最大的问题是:如果反复压缩,会造成图像质量逐渐退化.所以在对JPG文件进行处理,并且输出仍然选择JPG格式的情况下,很多人都会问同样的一个问题:如何才能在尽情享受有损压缩带来的较小文件长度的便利前提下,尽量避免图像质量退化? 为了解

oc 文件管理NSFileManager,文件读写NSFileHandle ,设计一个文件管理类将一个文件复制到另一个文件,由于文件过大要求每次复制100长度,通过NSFileHandle 来操作,并

设计一个文件管理类将一个文件复制到另一个文件,由于文件过大要求每次复制100长度,通过NSFileHandle来操作,并通过代理模式打印出当前的赋值进度百分比 main.m #import <Foundation/Foundation.h> #import "FileMaker.h" int main(int argc,const char * argv[]) { @autoreleasepool { NSString * fromPath = [NSHomeDirecto

UNIX,基础知识,文件IO,文件和目录

2015.1.27星期二,早晨阴天,中午下雪了今天上午老师不上课,程序语句,记一下:main(void){ int c; while((c = getc(stdin)) != EOF) if(putc(c,stdout) == EOF) 将字符写到标准输出 err_sys("output error"); if(ferror(stdin)) err_sys("input error"); exit(0);} 从标准输入读命令并执行:int main(){ char

十一、文件和目录——文件操作函数(续)

11.3 truncate 和  ftruncate 函数 --- 文件截短函数 11.3.1 函数介绍 改变文件大小的函数 相关函数 open 1 #include <unistd.h> 2 int truncate(const char * path, off_t length); 3 int ftruncate(int fd, off_t length); 函数说明 在文件尾端处截去一些数据以缩短文件 将一个文件的长度截短为 0 是一个特例,用 O_TRUNC 标志可以做到这一点 如果该

文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

 1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; //通过ofstream的方式实现写入文件 open,close void main() { ofstream fout;  //ofstream输出文件 fout.open("E:\\1.txt");//打开文件 fout << "1234abcdef";

微信企业号上传媒体文件之服务器文件上传

微信企业号上传媒体文件之服务器文件上传 企业在使用接口时,对多媒体文件.多媒体消息的获取和调用等操作,是通过media_id来进行的. 通过接口https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE,企业可以上传多媒体文件. 注意,每个多媒体文件(media_id)会在上传到微信服务器3天后自动删除,以节省服务器资源. 通常文件上传是通过html表单进行的,通过HttpURLConn

20141227文件夹和文件操作二

文件操作 对文件里面的内容进行读写 PHP5文件操作 将文件的内容整个进行读取和写入 读取文件 file_get_contents:从一个指定的文件内读取数据内容. 写入内容 file_put_contents:将指定的字符串写入到对应的文件 注意:file_put_contents如果要写入的文件不存在,系统会自动创建,有的话就直接写入 默认的file_put_contents写入数据的时候,会先清空数据再写入 如果要在文件后面追加内容:应该使用file_put_contents的第三个参数

php学习笔记--高级教程--读取文件、创建文件、写入文件

打开文件:fopen:fopen(filename,mode);//fopen("test.txt","r"): 打开模式:r  仅仅读方式打开,将文件指针指向文件头 r+  读写方式打开,将文件指针指向文件头 w  写入方式,指向文件头,假设不存在则尝试创建 w+ 读写方式,指向文件头,假设不存在则尝试创建 a  写入方式打开,指向文件末尾,假设不存在则尝试创建 a+ 读写方式打开,指向文件末尾,假设不存在则尝试创建 读取文件:fread:fread(); rea