weiqi7777

进击吧,linux(八) 文件复制实现

0
阅读(1771)

 

           之前,学习了文件的操作。这下,就可以使用这些操作,来写一个实现文件复制的程序。该程序和linuxcp一样,接收两个参数,一个复制的文件,一个是复制的目的地。考虑简单实现,就不要带可选参数了。

   clip_image002

  Linux中,使用cp命令,可以进行文件的复制。

 实现文件的复制,要有以下几步:

1、  打开复制的文件

2、  打开待复制的文件

3、  读取复制的文件的内容

4、  将读取的内容写入到待复制的文件中

5、  关闭两个文件

考虑到复制的文件可大可小,所以采用循环读取和写入的方法,每次从复制的文件中读取特定长度大小的数据,然后再写入到待复制文件中,知道读取数据结束。

以下是实现的代码。

/*
*文件名:    file_cp.c
*创建者: weiqi7777
*创建时间:  2015年6月17日
*程序说明:  实现文件的复制
*/
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#define CP_LEN 512
 

/*
* 函数名:  main
* 参数:
    argc:  参数的个数
    argv: 各个参数的内容
* 返回值:无
* 函数功能:实现文件的复制
*/
void main(int argc, char **argv)
{
    int fds;
    int fdd;
    char buf[CP_LEN];
    int count;
    /* 1、打开源文件  */
    fds = open(argv[1],O_RDONLY);
    /* 2、打开目标文件 */
    fdd = open(argv[2],O_WRONLY|O_CREAT,0777);
    do
    {
        /* 3、读取源文件数据 */
        count = read(fds,buf,CP_LEN);
        /* 4、将读出来的数据写入到目标文件*/
        write(fdd,buf,count);
    }while(count >= CP_LEN);
   
    /*关闭文件 */
    close(fds);
    close(fdd);
}


为了代码的规范,文件有加头,指明文件名,创建者,创建时间以及文件内容。函数也是有头的。说明该函数的相关信息。

在使用main函数的时候,使用到了main的两个参数。

        void main(int argc, char **argv)

第一个参数,argc,表示输入参数的个数

第二个参数,argv,表示输入各个参数的内容

这些是C语言的一些知识。

比如,使用命令  cp  file1  file2

那么argc就为3 有三个参数,argv[0]= cp , argv[1]= file1 ,  argv[2]= file2

所以,通过main函数的两个参数,就可以得到复制的文件和待复制的文件了。

下面处理就比较简单了,打开两个文件,源文件使用只读的方式打开,目的文件使用创建的方式打开,文件的权限是777。然后就一个循环,从源文件里面读取512个字节大小数据保存在数组中,这个512是通过宏定义的,然后再将读取的数据写入到目的文件中。如果某一次读取源文件的数据个数小于512个,就说明源文件的数据读取结束了,循环就结束了。最后将文件关闭。

使用gcc编译

    clip_image003

就可以使用了。

clip_image005

还可以将生成的file_cp拷贝到/lib目录下,这样,就可以在任何目录使用file_cp,进行文件的复制了。

这样,就实现了一个最简单的文件复制程序。不带任何参数。