当前位置: 首页 > news >正文

Linux 实现文件后半部分的复制

继上次实现文件从后往前数2k的数据进行复制,此次要求是文件的一半且是后半部分。

即复制源文件sour_file的后半部分到dest_file

除了数据上从后2K变化到后一半之外,其他的几乎没有什么变化。

这道题的关键点就在于后一半怎么求,在经历了用 lseek(writed,0,SEEK_SET)求文件总长,用sizeof()函数求文件大小,strlen()函数求字符串长度等等等等N次尝试之后,意外发现了一种能达到效果且好用的方法:Struct stat 结构体。

如上图所示,struct stat 结构体内容是不需要自己写的,这算是自带属性。

这样一来就简单多了。

struct stat st;
//先把这个结构体拽出来
fstat(writed,&st);
//fstat函数的作用就是把得到的文件writed的属性给到结构体
int len=st.st_size;
//再调用得到其大小

如此就完整得到了源文件的大小。

我们只要后半部分,于是先取其一半

int filesize=len/2;lseek(writed,filesize,SEEK_END);
//将光标从后往前移到文件二分之一处

或者从前往后移动二分之一也可以

lseek(writed,filesize,SEEK_SET);

然后从当前位置读取内容,写到目标文件就可以了

源码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main(int argc,char *argv[])
{int writed; int readed;int writed_len;int readed_len;int len_lseek;struct stat st;if(argc!=3){printf("Input invaild\n");return -1;}writed=open(argv[1],O_RDONLY);\\只读打开if(writed<=0){printf("Open Source File '%s' Failure",argv[1]);return -1;}readed=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);if(readed<=0){printf("Create Destination File '%s' Failure",argv[2]);return -1;}fstat(writed,&st);//将writed文件属性全部复制到结构体len_lseek=st.st_size; //利用stat结构体求得文件大小char buf[1024];lseek(writed,-len_lseek/2,SEEK_END);//将光标移动到文件1/2位置int count=0;while((readed_len=read(writed,buf,sizeof(buf)))!=0) //从源文件读取数据,直到全部读完{writed_len=write(readed,buf,readed_len);//将读取的内容写入到目标文件if(writed_len>0){printf("拷贝完成%d次\n",count+1);}if(writed_len<0){printf("Write Destination File '%s' Failure",argv[2]);}count++;}printf("The File has been copied and Executed %d times\n", count);close(writed);close(readed);
}

网上随便复制了一段,放在了源文件里。

运行结果:

差不多是一半,我也没数,有强迫症可以数一数ヽ(゚∀゚)メ(゚∀゚)ノ ヾ(๑╹◡╹)ノ"ヾ(●´∀`●) 

http://www.lryc.cn/news/222539.html

相关文章:

  • 阿里开源中间件一览
  • Ubuntu20.04下Salome_meca 2022软件安装(支持GPU加速)
  • uniapp:打包ios配置隐私协议框
  • JS逆向爬虫---请求参数加密③【比特币交易爬虫】
  • 云计算:未来科技的超级英雄
  • 【Node.js入门】1.3 开始开发Node.js应用程序
  • ansible-playbook之file模块
  • Vue路由介绍及使用
  • 案例 - 拖拽上传文件
  • github 上传代码报错 fatal: Authentication failed for ‘xxxxxx‘
  • Linux虚拟网络设备之bridge
  • 最后一个大更新!Win11 2023正式发布:Copilot终于来了
  • pandas教程:Reading and Writing Data in Text Format (以文本格式读取和写入数据)
  • 软考高级系统架构设计师系列之:软考高级系统架构设计师论文专题
  • 目标检测中的评价指标
  • 【AI编程】ai编程插件汇总iFlyCode、codegeex
  • 算法通关村第八关|黄金挑战|二叉树的最近公共祖先
  • 亚马逊云科技产品测评』活动征文|通过使用Amazon Neptune来预测电影类型初体验
  • 【获奖论文】2023年数学建模国赛优秀获奖论文
  • 美团三年,总结的10条血泪教训
  • 【CSP认证考试】202309-1:坐标变换(其一)100分解题思路+代码
  • 剩余参数和展开运算符的区别
  • ES6的基础用法
  • standard_init_linux.go:211: exec user process caused “exec format error“
  • python的format函数的用法及实例
  • BigDecimal 类型的累加操作
  • 基于单片机的土壤温湿度控制系统
  • 服务器数据库中了elbie勒索病毒怎么办,elbie勒索病毒解密,数据恢复
  • 接口测试及接口测试工具
  • JUC包工具类介绍二