码迷,mamicode.com
首页 > 其他好文 > 详细

文件长度和文件截短

时间:2015-06-24 12:31:15      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

转自  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.   
  4. int main(int argc, char * argv[]){  
  5.         struct stat buf;  
  6.   
  7.         if(argc != 2){  
  8.                 printf("you must specify one parameter.\n");  
  9.                 return -1;  
  10.         }  
  11.   
  12.         if(lstat(argv[1],&buf) < 0){  
  13.                 perror("stat");  
  14.                 return -1;  
  15.         }  
  16.   
  17.         printf("st_size:%ld\n",buf.st_size);  
  18.         printf("st_blksize:%ld\n",buf.st_blksize);  
  19.         printf("st_blocks:%ld\n",buf.st_blocks);  
  20. }  
运行结果:
yan@yan-vm:~/apue$ ./a.out a.out
st_size:7526
st_blksize:4096
st_blocks:16
yan@yan-vm:~/apue$ ll a.out
-rwxrwxr-x 1 yan yan 7526 Jun 12 15:53 a.out*
文件大小:7526字节,文件块大小:4096字节,512块数量:16
 
 
如果是空洞文件,stat中保存的大小是多少呢?
下面是一个包含空洞的文件,10个字节+40960个字节空洞+10个字节。
yan@yan-vm:~/apue$ ll a.txt
-rw------- 1 yan yan 40980 Jun 12 16:00 a.txt
yan@yan-vm:~/apue$ du -h a.txt
8.0K    a.txt
执行上面的程序进行大小的测定:
yan@yan-vm:~/apue$ ./a.out a.txt
st_size:40980
st_blksize:4096
st_blocks:16
虽然st_size是40980字节,但是st_blocks还是16(16*512=8192字节)
 
如果是符号链接文件,则stat保存的大小是多少呢?
下面是一个符号链接文件:
yan@yan-vm:~/apue$ ll symblicfile
lrwxrwxrwx 1 yan yan 7 Jul 10 07:21 symblicfile -> desfile
执行上面的程序进行大小的测定:
yan@yan-vm:~/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.   
  5. int main(void){  
  6.         if(truncate("a.txt",5)<0){  
  7.                 perror("truncate");  
  8.                 return -1;  
  9.         }  
  10.   
  11.         int fd = -1;  
  12.         if((fd = open("b.txt",O_RDWR))<0){  
  13.                 perror("open");  
  14.                 return -1;  
  15.         }  
  16.   
  17.         if(ftruncate(fd,8)<0){  
  18.                 perror("ftruncate");  
  19.                 return -1;  
  20.         }  
  21.   
  22.         if(fd != -1){  
  23.                 close(fd);  
  24.         }  
  25.         return 0;  
  26. }  
运行结果:
yan@yan-vm:~/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
yan@yan-vm:~/apue$ ./a.out
yan@yan-vm:~/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.   
  5. int main(void){  
  6.         if(truncate("a.txt",-1)<0){  
  7.                 perror("truncate");  
  8.                 return -1;  
  9.         }  
  10.         return 0;  
  11. }  
运行结果:
yan@yan-vm:~/apue$ ll a.txt
-rw-rw-r-- 1 yan yan 5 Jul 10 07:12 a.txt
yan@yan-vm:~/apue$ ./a.out
truncate: Invalid argument
 
如果length的值大于文件的大小呢?
[cpp] view plaincopy
 
  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3. #include <fcntl.h>  
  4.   
  5. int main(void){  
  6.         if(truncate("a.txt",10)<0){  
  7.                 perror("truncate");  
  8.                 return -1;  
  9.         }  
  10.         return 0;  
  11. }  
运行结果:
yan@yan-vm:~/apue$ ll a.txt
-rw-rw-r-- 1 yan yan 5 Jul 10 07:12 a.txt
yan@yan-vm:~/apue$ ./a.out
yan@yan-vm:~/apue$ ll a.txt
-rw-rw-r-- 1 yan yan 10 Jul 10 07:15 a.txt
yan@yan-vm:~/apue$ od -c a.txt
0000000   1   2   3   4   5  \0  \0  \0  \0  \0
0000012
文件被自动填充为\0

文件长度和文件截短

标签:

原文地址:http://www.cnblogs.com/QingCHOW/p/4597238.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!