实现cp命令(7)
时间:2010-08-09 来源:edsionte
一开始,我们先想这样的问题:
我们要执行命:cp -r newdir dir/ 。而在dir/下已经存在了newdir/目录。那么执行了此条命令,会产生什么结果?
my_cp的结果是删除目的newdir目录,将源目录复制到dir/下。如果你对cp足够了解(不了解?trrrrrrrrry),这么做显然是不完美的。cp命令的结果是:不完全的覆盖。具体是,1.对newdir/和dir/newdir/中都存在的文件file,newdir中的file将会覆盖dir/newdir/中的file;2.对于newdir/中存在而dir/newdir中不存在的文件,直接创建新文件进行拷贝;3.对于newdir/中不存在而dir/newdir中存在的文件,此次操作对这个文件没有影响。注意,上述中的覆盖或拷贝只涉及到文件内容,至于文件权限的拷贝,则需添加-p选项(关于此选项可参见这里的文章)。
本文就是要对my_cp进行修改,让其功能和cp命令相同。当前my_cp对上述情况的处理就是直接删除dir/newdir这个原文件夹,然后又新建dir/newdir。当然此时新建的newdir中的文件是和源newdir相同的。
我们的修改方案其实很简单!我们先检查目的目录是否存在;存在时,我们再提取源路径中的最低级目录(存储于lowestdir中)。将其与目的目录连接,再存于temp_dest_path变量中。我们再检查temp_dest_path中的路径是否存在,存在说明我们不能完全的覆盖(如上述举例)!那么我们现在就可以确定temp_dest_path就是我们接下来要用到的目的目录,我们j将其复制到dest_path中即可。如果temp_dest_path不存在,那么直接在目的目录下新建lowestdir这个目录,我们用到mkdir这个函数。
对于上述开始的举例,我们首先提取lowestdir="newdir";然后temp_dest_path="dir/newdir";从已知中,我们知道temp_dest_path中的路径是存在的,因此我们只是将它里面存储的路径复制到dest_path中即可。
以上所述内容的具体实现详见下面的代码:
//extract the lowest directory of src path int i,k=0; char lowestdir[PATH_MAX+1]; char temp_dest_path[PATH_MAX+1]={'\0'}; struct stat temp_dest_buf; for(i=strlen(src_path)-1-1;i>\0;i--) { if(src_path[i]=='/') { i=i+1; break; } } for(;i<\strlen(src_path);i++) { lowestdir[k++]=src_path[i]; } lowestdir[k]='\0'; strncpy(temp_dest_path,dest_path,strlen(dest_path)); strncat(temp_dest_path,lowestdir,strlen(lowestdir)); if(stat(temp_dest_path,&temp_dest_buf)==0) { strncpy(dest_path,temp_dest_path,strlen(temp_dest_path)); } else { if(mkdir(temp_dest_path,S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)==-1) { printf("my_cp:create the directory \"%s\" error.\n",dest_path); return ; } strncpy(dest_path,temp_dest_path,strlen(temp_dest_path)); }
我们再来看一下修改后的运行结果:
gues@huangwei-desktop:~/code/shell_command$ ls newdir/ -l 总用量 12 drwxr-xr-x 2 gues gues 4096 2010-08-08 21:21 littedir -rw-r--r-- 1 gues gues 221 2010-08-09 17:05 my_ls.c -rw-r--r-- 1 gues gues 15 2010-08-09 16:13 srchasthisfile gues@huangwei-desktop:~/code/shell_command$ ls dir/newdir/ -l 总用量 12 -rw-r--r-- 1 gues gues 15 2010-08-09 17:45 desthasthisfile -rw-r--r-- 1 gues gues 221 2010-08-09 17:45 hello.c drwxr-xr-x 2 gues gues 4096 2010-08-09 17:45 littedir gues@huangwei-desktop:~/code/shell_command$ cp newdir/ -r dir/ gues@huangwei-desktop:~/code/shell_command$ ls dir/newdir/ -l 总用量 20 -rw-r--r-- 1 gues gues 15 2010-08-09 17:45 desthasthisfile -rw-r--r-- 1 gues gues 221 2010-08-09 17:45 hello.c drwxr-xr-x 2 gues gues 4096 2010-08-09 17:45 littedir -rw-r--r-- 1 gues gues 221 2010-08-09 17:47 my_ls.c -rw-r--r-- 1 gues gues 15 2010-08-09 17:47 srchasthisfile
ok。修改完毕。