/*
*cp.c文件夹复制
*用法:cp [源目录] [目标目录]
*例如:cp /etc/apt /home,如果权限不够,加上sudo
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <dirent.h>
/*
**getname(),用于获取文件夹名字,如/home/sk/test 得到test
*/
char *getname(char *path)
{
char *name = path;
while(*path)
{
if(*(path++) == '/')
name = path;
}
return name;
}
/*
*do_cp(),若都是目录文件,将src里的所有文件复制到dst中,
*若都是普通文件,将src复制到dst
*/
void do_cp(char *src ,char *dst)
{
struct stat st;
DIR *dir;
struct dirent *direntp;
int des_size = strlen(dst);
int source_size = strlen(src);
if (stat(src,&st) == -1)
{
perror(src);
return ;
}
/*如果是目录文件*/
if (S_ISDIR(st.st_mode))
{
if (mkdir(dst, st.st_mode) == -1)
{
perror(dst);
return ;
}
/*打开目录*/
if((dir = opendir(src))==NULL)
{
perror(src);
return;
}
/*遍历目录*/
while((direntp = readdir(dir))!=NULL)
{
if((!strcmp( direntp->d_name,"."))||(!strcmp(direntp->d_name,"..")))
continue;
dst[des_size++] = '/';
src[source_size++] = '/';
strcpy(src+ source_size,direntp->d_name);
strcpy(dst + des_size,direntp->d_name);
do_cp(src,dst); //递归一下
}
dst[--des_size] = 0;
src[--source_size] = 0;
}
/*如果是普通文件*/
else
{
int fdsrc,fddst;
int ret;
/*打开源文件*/
if((fdsrc= open(src,O_RDONLY)) == -1)
{
perror(src);
return;
}
/*创建目标文件*/
if((fddst = creat(dst, O_CREAT|O_WRONLY|O_TRUNC))== -1)
{
perror(dst);
close(fddst);
return;
}
char buf[1024];
int size = 1024;
/*从原始文件read,再write到目标文件*/
while (((ret = read(fdsrc,buf,size)) != -1) && ret)
{
if (write(fddst, buf, ret) == -1)
{
perror("error");
break;
}
}
close(fdsrc);
close(fddst);
/*给予权限*/
chmod(dst, st.st_mode);
}
}
int main(int argc, char* argv[])
{
DIR *dirp;
struct stat st_info;
char dstpath[1024];
char src[512], dst[512];
if(argc != 3) //简单参数判断
{
printf("parameter wrong\n");
return -1;
}
strcpy(src, argv[1]); /*src为源目录*/
strcpy(dst, argv[2]); /*dst为目标目录*/
char* dname = getname(src);
strcpy(dstpath, dst);
strcat(dstpath, "/");
strcat(dstpath, dname);
if( (access(dst, 0 )) == 0 ) /*若dst存在,则将src复制到dst目录下
若不存在,新建dst目录,将src下的
文件复制到dst下*/
{
do_cp(src, dstpath);
}
else do_cp(src, dst);
}
cp.tar.gz_linux copyfile_拷贝文件
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
在Linux操作系统中,文件和目录的管理是日常操作的重要部分,而`cp.tar.gz`这样的压缩包文件提供了方便的文件拷贝解决方案。本压缩包包含了两个关键文件:`cp.c`和`dircp`,它们是用C语言编写的程序,用于在Linux环境下实现文件和目录的复制功能。 `cp.c`文件很可能是实现了一个命令行工具,它模仿了Linux内置的`cp`命令。`cp`命令是Linux中用于复制文件或目录的常用命令,其功能强大且灵活。通过解析命令行参数,`cp.c`可以接受源文件或目录路径以及目标位置,并实现文件或目录的拷贝。这个程序可能包含以下关键知识点: 1. 文件描述符与文件操作:C语言中,文件操作通常涉及到文件描述符,如`open()`、`read()`、`write()`和`close()`函数。`cp.c`可能使用这些函数来读取源文件并写入目标文件。 2. 文件权限与属性:在复制过程中,保持源文件的权限和时间戳等属性是必要的。这可能涉及`chmod()`、`utime()`等函数。 3. 目录处理:如果`cp.c`也支持目录拷贝(递归复制),那么它需要处理目录结构,遍历其中的所有文件和子目录,这需要用到`opendir()`、`readdir()`和`closedir()`等函数。 4. 错误处理:在文件操作中,错误处理至关重要。C语言的`errno`全局变量和`perror()`函数可以用来捕获和显示错误信息。 另一方面,`dircp`可能是一个专门用于目录复制的程序,它可能比`cp.c`更专注于递归地复制整个目录结构,而不只是单个文件。`dircp`可能使用到以下技术: 1. 遍历目录:`dircp`可能使用`opendir()`、`readdir()`来遍历目录,找出所有子目录和文件。 2. 动态内存分配:在处理递归目录结构时,可能需要动态创建数据结构(如链表)来存储路径信息。 3. 并发复制优化:为了提高效率,`dircp`可能利用多线程或异步I/O来并发复制多个文件或子目录。 4. 符号链接处理:在Linux中,目录可以包含符号链接,`dircp`需要决定如何处理这些链接:是复制链接本身还是复制链接指向的目标。 这个压缩包提供的源代码是学习Linux系统编程和文件操作的好材料。通过阅读和理解这些代码,开发者可以深入理解C语言在Linux环境下的文件和目录操作,这对于系统管理员和底层开发人员来说是非常有价值的技能。同时,这些程序也可以作为实际工作中文件拷贝任务的定制化解决方案。























- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 83
- 资源: 1万+





我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- agenda_3ck_01b_0519.pdf
- agenda_3ck_01_0719.pdf
- agenda_3ck_01a_0319.pdf
- agenda_3ck_01c_0518.pdf
- agenda_3ck_01b_0918.pdf
- alping_01_1106.pdf
- anslow_01_0109.pdf
- anslow_01_0108.pdf
- anslow_01_0107.pdf
- anslow_01_0110.pdf
- anslow_01_0308.pdf
- anslow_01_0307.pdf
- anslow_01_0310.pdf
- anslow_01_0309.pdf
- anslow_01_0508.pdf
- anslow_01_0709.pdf


