欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux下的文件操作之文件复制

程序员文章站 2022-06-10 11:13:07
...

知识点提炼:

  1. open(const char *pathname,int flags)函数的使用,
    第一个参数为文件所在路径以及文件名,
    第二个参数为的打开文件的方式,有三种O_RDONLY.(只读),O_WRONLY(只写),O_RDWR(读写),以“|”连接添加新功能,常用功能 有O_APPEND(以追加的方式打开文件),O_CREAT(若无该文件,就创建文件)
  2. main()函数参数的使用  main(int argc,char **argv)  
    argc代表参数的个数,
    argv为二级字符串指针,即为多个字符串数组,a也就是说,argv[0]代表其第一个参数,argv[1]代表其第二个参数,arg[2]代表其第三个参数,以此类推
  3. lseek()函数的使用,
    第一个参数为文件描述符,
    第二个参数为偏移量,
    第三个参数(SEEK_CUR,SEEK_SET,SEEK_END),返回值为当前位置到开头的字节数

    以下为实现文件复制的代码:
  4. #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <fcntl.h>
    #define BUFFER_SIZE 15
    //文件复制
    int main(int argc,char **argv)
    {
            int from_fd ,to_fd;
            int file_len=0;//记录文件的长度
            int ret=1;//记录读文件的字节数
            char buffer[BUFFER_SIZE];
            if(argc !=3)//参数个数
            {
                    printf("argc not enough\n");
                    exit(0);
            }
    
            if((from_fd=open(argv[1],O_RDONLY|O_CREAT))==-1)
            {
                    printf("open %s failed\n",argv[1]);
                    exit(0);
            }
            if((to_fd=open(argv[2],O_WRONLY|O_CREAT))==0)
            {
                    printf("open %s failed\n",argv[2]);
                    exit(0);
            }
            //lseek的使用
            file_len=lseek(from_fd,0,SEEK_END);//读出文件行数
            lseek(from_fd,0,SEEK_SET);//将文件指针放回文件起始位置
            printf("this file has %d bytes\n",file_len);
            //进行文件的复制
            while(ret)
            {
                    ret=read(from_fd,buffer,BUFFER_SIZE);//读文件中的内容
                    if(ret==-1)
                    {
                            printf("read error");
                            exit(1);
                    }
                    write(to_fd,buffer,ret);//将读到的数据写到文件里
                    file_len-=ret;
                    bzero(buffer,BUFFER_SIZE);//清空缓冲区
            }
            close(from_fd);
            close(to_fd);
            exit(0);
    
    
    }
    

    编译以及测试代码
     

    //编译文件
    gcc  copy_file.c -o copy
    //执行文件
    sudo ./copy from.c to.c
    //测试文件
    //若文件内容相同则无输出
    sudo diff from.c  to.c

    注意:应保证from.c里有内容

相关标签: linux copy file