系统编程中的文件大小修改truncate/lseek
来源:互联网 发布:淘宝网经验 编辑:程序博客网 时间:2024/05/16 16:18
系统编程中的文件大小修改truncate/lseek
思维导图
文字说明
lseek函数虽然可以扩展文件大小,但是与文件系统实现机制有关,在指定偏移量超过原文件大小的时候,会产生空洞,但是最后关闭文件的时候,内核是否把这些空洞写入到磁盘区块,则不是一定的,很多时候只扩展你实际写入的字节数!并不是在指定位置处写入新字符以后就完成指定偏移量的扩展。比如你在Ubuntu14.04想用
lseek(fd,1024,SEEK_END);扩展文件,在原基础上增加1024字节,接着执行write(fd,”a”,1);往文件末尾写入一个字节,实际上源文件只扩大了一个字节而不是1024个.truncate则是按照所给参数修改文件大小。简单粗暴!推荐使用!
示例代码
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>int main(int argc,char ** argv){ int ret = 0; int fd ; struct stat my_st; if(argc < 2)//提示使用信息 { printf("usage : app filename!!!\n"); return -1; } printf("==========lseek=============\n"); fd = open(argv[1],O_CREAT|O_RDWR|O_APPEND,0755);//打开文件 if(fd == -1) { perror("open lseek"); return -1; } ret = lseek(fd,0,SEEK_END);//定位到文件尾得到文件大小 printf("old size = : %d\n",ret); ret = lseek(fd,1024,SEEK_END);//扩展文件--在原基础上增加1024字节--会产生空洞(在内核空间)--但是否占用磁盘大小与文件系统系统 if(ret == -1) { perror("lseek"); return -1; } printf("new size = : %d\n",ret); write(fd,"a",1);//往文件末尾写入一个字节--lseek扩展文件大小 ret = lseek(fd,0,SEEK_END);//再次获取新文件大小--Ubuntu14.04的64位系统多余的空洞不占用磁盘空间,只扩大了所写入的实际字节数 printf("new size = : %d\n",ret); close(fd); printf("==========truncate=============\n"); truncate(argv[1],2048);//truncate修改文件大小--直接将文件大小定死 ret = stat(argv[1],&my_st);//穿透软链接直接查看原始文件的状态信息 if(ret == -1) { perror("stat"); return -1; } printf("file size = : %d\n",(int)my_st.st_size); return 0;}
0 0
- 系统编程中的文件大小修改truncate/lseek
- 系统编程中的文件大小修改truncate/lseek
- truncate函数和ftruncate修改文件大小-linux
- Linux系统编程--lseek调用
- liunx系统编程中的open(),close(),lseek(),write(),read()及相关例子
- Linux文件编程之【系统调用】—— lseek()
- 修改2003系统默认上传文件大小
- linux 使用lseek函数来获取文件大小
- 系统调用 6--lseek
- linux 系统函数记录 lseek
- Linux系统lseek函数作用
- 系统函数-文件操作-lseek()
- open,lseek,read,write,close系统调用《unix环境高级编程读书笔记》(1)
- Linux系统调用及用户编程接口(API) open close write read lseek
- Linux 通过lseek()来实现文件大小的设置
- Linux 通过lseek()来实现文件大小的设置
- linux下通过lseek()实现文件大小设置
- Linux 通过lseek()来实现文件大小的设置
- 《算法概论》第八章习题 8-15
- javascript事件, 解决mousedown和click冲突事件, 鼠标事件, 键盘事件, 文本事件用法简介
- kvm:linux的虚拟机监控器(kvm: the Linux Virtual Machine Monitor)
- 金牌 银牌 铜牌
- python中基于descriptor的一些概念 新式类 旧式类
- 系统编程中的文件大小修改truncate/lseek
- Gradle命令编译Android项目
- java多线程-06-atomic包
- MySQL 的CASE WHEN 语句使用说明
- CodeForces 141C Queue
- Linux
- 无需焦点的跑马灯TextView
- adb抓取log命令
- 使用MyBatis 框架犯的错误