Linux 实现cp 命令

原创 2015年07月06日 23:50:32

cp 

用来复制文件或目录


下面说一下main函数的参数

int main(int ac , char **av)
也可写成

int main(int ac , char * av[])
第一个int型参数是命令行参数个数,第二个char ** 型参数是个字符指针数组,保存命令行各参数的名字(字符串)


比如对于cp来说 命令行有3个参数

cp file1 file2

则av[1] 存储 fille1这个字符串, av[2] 存储file2这个字符串, ac 等于3。

av[0] 不同环境有所不同:

经测Dev-C++ 中是D:\xx\xx\ cp01.exe

$ ./cp01 cp01.c copy_cp01.c
而我的Linux这样的命令行后av[0] 是 ./cp01

以上两者av[0]都是当前可执行文件名,前者包含了路径。


cp 用到了open函数来打开av[1];read函数读av[1];creat函数创建或清空av[2];write函数写入av[2];


/**
* cp01.c
* uses read and write with tunable buffer size
*/

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>

#define BUFF_SIZE 4096
#define COPY_MODE 0644

void oops(char * s1, char * s2);

int main(int ac, char **av)
{
	int  in_fd, out_fd, n_chars;
	char buf[BUFF_SIZE];
 
	/* check args */
	if( ac != 3)  // must three parameters
	{
		fprintf(stderr, "usage: %s source destination\n", *av);
	}

	/* open files */
	if( (in_fd = open(av[1], O_RDONLY)) == -1)
	{
		oops("Cannot open ", av[1]);
	}

	if( (out_fd = creat(av[2], COPY_MODE)) == -1 )
	{
		oops("Cannot creat ", av[2]);		
	}

	/* copy files */
	while( (n_chars = read(in_fd, buf, BUFF_SIZE)) > 0 )
	{
		if(write(out_fd, buf, n_chars) != n_chars )
		{
			oops("Write error from ", av[1]);
		}
	}

	if( n_chars == -1 )
	{
		oops("Read error from ", av[1]);
	}

	/* close files */
	if(close(in_fd) == -1 || close(out_fd) == -1)
	{
		oops("Error closing files", "");
	}

	return 0;
}

/**
* abnormal information
*/
void oops(char *s1, char *s2)
{
	fprintf(stderr, "Error: %s ", s1);
	perror(s2);
	exit(1);
}


用cmp比较复制的文件并无不同。

有趣的是

它可以复制它自己。



最后把cp01.c复制到Linux和Windows的共享文件夹。作用之一方便我把Linux里的代码粘贴到博客中来。



版权声明:本文为博主原创文章,未经博主允许不得转载。

linux下实现cp -r的经验

算法一定用递归     (1)设置两个数组,一个用来存储你递归到那个目录,一个用来存储你拷贝到那个目录 (2)拷贝文件很简单,拷贝目录注意第一次拷贝和之后拷贝的差别,我是先创建好,然后再进去 (...
  • hello_bravo_
  • hello_bravo_
  • 2016年08月24日 19:43
  • 692

Linux中的 cp 命令

功能: 复制文件或目录 说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目...
  • u014488381
  • u014488381
  • 2015年01月10日 14:55
  • 1131

Linux&C编程之Linux系统命令“cp -r”的简单实现

关于会用到的文件与目录的一些基本函数可参考: Linux&C编程之Linux系统命令“ls -l”的简单实现 一、测试结果:二、源代码:1、自定义头文件copy.h:/*copy.h*/ #ifnd...
  • Apollon_krj
  • Apollon_krj
  • 2017年02月18日 21:18
  • 913

Linux cp -a用法

cp -a 在保留原文件属性的前提下复制文件    cp -r dirname destdir   复制目录后其文件属性会发生变化 想要使得复制之后的目录和原目录完全一样,可以使用cp...
  • yanying861212
  • yanying861212
  • 2017年04月20日 15:35
  • 2184

linux cp、mv、rm 强制覆盖

Linux 使用 cp 命令强制覆盖功能 [日期:2011-01-04] 来源:Linux社区  作者:Linux 我们平常在Linux中使用 cp 命令时,...
  • ownfire
  • ownfire
  • 2012年09月11日 16:48
  • 21237

linux cp命令参数及用法详解---linux 复制文件命令cp

cp (复制档案或目录) [root@linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination) [root@linux ~]# cp [opti...
  • lwnylslwnyls
  • lwnylslwnyls
  • 2012年08月24日 11:01
  • 19570

Linux下cp命令 -f无效的解决方法

关于Linux的拷贝命令我们都知道cp的参数 -f的意思是: -f, --force                  if an existing destination file cannot ...
  • carolzhang8406
  • carolzhang8406
  • 2014年11月21日 13:43
  • 6903

cp -r 和 cp -R 的区别

今天倒腾linux根文件系统的时候发现 cp -r /dev /dev_bak 时,竟然会 将磁盘设备中的数据进行一次拷贝,而不是仅仅建立设备文件。   于是到网上搜了一把,收获不小。  ...
  • lh2016rocky
  • lh2016rocky
  • 2016年10月18日 21:51
  • 1146

linux cp 命令实现

linux cp 简单实现就是read 源文件的内容到一个buffer, 然后再将buffer 中的内容 write 到要copy 的目标文件中去,这样就实现了cp 的功能。 看了busybox 中...
  • chenqiang0721
  • chenqiang0721
  • 2013年05月13日 17:16
  • 1184

Linux cp命令直接覆盖不提示方法

在有时拷贝文件比较多的目录,cp覆盖时,无论加什么参数-f之类的还是提示是否覆盖,这在cp覆盖操作的时候是不能忍受的。 把a目录下的文件复制到b目录  代码如下 复制代码...
  • lanmolei814
  • lanmolei814
  • 2014年07月12日 14:58
  • 3415
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux 实现cp 命令
举报原因:
原因补充:

(最多只允许输入30个字)