文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>实现cp命令(7)

实现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。修改完毕。

排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载