Linux系统编程---实现目录或者文件拷贝
关于拷贝文件,前面写过一个例子:点击打开链接 ,可以看看,实现cp命令。
这次我们实现一个目录和文件的拷贝,综合点。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <dirent.h>
void copy_file(const char *src , const char *dest);
void copy_directory(const char *src , const char *dest , const char *name);
int main(int argc , char *argv[])
{
//参数校验
if(argc < 3)
{
perror("argument error ... ");
return -1 ;
}
struct stat state ;
stat(argv[argc-1] , &state);
//如果最后一个参数不是目录的话报错退出
if(!S_ISDIR(state.st_mode))
{
fprintf(stderr , "the last one is not a directory ... \n");
return -2 ;
}
int i ;
char buffer[256] = {0};
for(i = 1 ; i < argc-1 ; i++)
{
// printf("argv[%d]:%s\n" , i , argv[i]);
stat(argv[i] , &state);
if(S_ISREG(state.st_mode)) //判断参数是否为单独的文件
{
sprintf(buffer , "%s/%s" , argv[argc-1] , argv[i]);
//拷贝文件
copy_file(argv[i] , buffer);
continue ;
}
if(S_ISDIR(state.st_mode)) //判断参数是否为目录
{
//拷贝文件夹
copy_directory(argv[i] , argv[argc-1] , argv[i]);
continue ;
}
}
return 0 ;
}
void copy_file(const char *src , const char *dest)
{
int src_fd ;
int dest_fd ;
src_fd = open(src , O_RDONLY);
if(-1 == src_fd)
{
perror("mycy srcfile error");
return ;
}
char ch ;
dest_fd = open(dest , O_WRONLY | O_CREAT | O_EXCL , 0777);
if(dest_fd < 0)
{
//文件存在,判断是否覆盖
printf("Over write ? Y/N\n");
ch = getchar();
if((ch == 'Y') || (ch == 'y'))
{
close(dest_fd);
dest_fd = open(dest , O_WRONLY | O_TRUNC);
}else
{
return ;
}
}
//文件不存在,直接创建成功
char buffer[10] = {0} ;
int ret ;
while(1)
{
ret = read(src_fd , buffer , 10);
write(dest_fd , buffer , ret);
if(ret != 10)
break;
}
close(dest_fd);
close(src_fd);
}
void copy_directory(const char *src , const char *dest , const char *name)
{
char buffer[265] = {0};
char tmpbuffer[256] = {0};
char tmpbuffer1[256] = {0};
sprintf(buffer , "%s/%s" , dest , name);
int ret ;
struct stat state ;
DIR *dir = NULL ;
struct dirent *entry = NULL ;
ret = stat(buffer , &state);
if(ret == -1)
{
//目录不存在,copy
ret = mkdir(buffer , 0777);
printf("ret:%d buffer:%s\n" , ret , buffer);
dir = opendir(src);
if(NULL == dir)
{
perror("open dir error");
return ;
}
while(1)
{
entry = readdir(dir);
if(NULL == entry)
break;
if((strcmp(entry->d_name , ".")==0)||(strcmp(entry->d_name , "..")==0))
continue ;
sprintf(tmpbuffer , "%s/%s" , buffer , entry->d_name);
sprintf(tmpbuffer1 , "%s/%s" , src , entry->d_name);
stat(tmpbuffer1 , &state);
if(S_ISREG(state.st_mode))
{
copy_file( tmpbuffer1 , tmpbuffer);
}
if(S_ISDIR(state.st_mode))
{
copy_directory(tmpbuffer1 , buffer , entry->d_name);
printf("*********** %s -> %s \n" , tmpbuffer1 , buffer);
}
}
}
}
Linux系统编程---实现目录或者文件拷贝的更多相关文章
- Linux系统编程(1)——文件与I/O之C标准I/O函数与系统调用I/O
Linux系统的I/O也就是一般所说的低级I/O--操作系统提供的基本IO服务,与os绑定,特定于Linux平台.而标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头 ...
- Linux系统编程(2)——文件与IO之系统调用与文件IO操作
系统调用是指操作系统提供给用户程序的一组"特殊"接口,用户程序可以通过这组"特殊"接口来获得得操作系统内核提供的特殊服务.在linux中用户程序不能直接访部内核 ...
- linux系统编程快速定位头文件的技巧之强大的grep命令
这个技巧来自于我的实际开发碰到的: inet_addr这个函数用于把ip地址转成网络字节序,他的原型:in_addr_t inet_addr(const char *cp); 返回值为一个in_add ...
- Linux系统编程(3)——文件与IO之fcntl函数
linux文件I/O用:open.read.write.lseek以及close函数实现了文件的打开.读写等基本操作.fcntl函数可以根据文件描述词来操作文件. 用法: int fcntl(int ...
- Linux系统编程(5)——文件与IO之mmap函数
mmap系统调用它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作.而Posix或系统V的共享内存IPC则纯粹用于共享目的,mmap()实现共享内存也是其主要应用之一. ...
- linux 系统监控某目录下文件及文件夹的变化
inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [root@Oracle ~]# uname -r 2.6.32-22 ...
- Linux系统编程(4)——文件与IO之ioctl函数
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率.马达的转速等等.它的参数个数如下:int ioctl(int ...
- 《Linux系统编程(第2版)》
<Linux系统编程(第2版)> 基本信息 作者: (美)Robert Love 译者: 祝洪凯 李妹芳 付途 出版社:人民邮电出版社 ISBN:9787115346353 上架时间:20 ...
- Linux C 程序 文件操作(Linux系统编程)(14)
文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...
随机推荐
- 【luogu2161】【SHOI2009】Booking会场预约
原题传送门 题意简析:你需要写一个数据结构,维护一个时间轴,支持如下操作: 1)插入1个新区间,删除所有时间轴上与它有交的区间并输出个数. 2)查询当前时间轴上的区间个数. 解题思路:裸的无旋trea ...
- hdu 5112 (2014北京 水)
题意:有个人在跑步,一直每个时间他所在的位置,求最大速度 #include <iostream> #include <cstring> #include <cstdio& ...
- hdu 1043(经典搜索)
题意: 给你一个初始的图,然后每次输入一个图,要求移动x最小的步数达到和初始图一样,输出路径 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 5 6 7 ...
- face-alignment:用 pytorch 实现的 2D 和 3D 人脸对齐库
使用世界上最准确的面对齐网络从 Python 检测面部地标,能够在2D和3D坐标中检测点. 项目地址:https://github.com/1adrianb/face-alignment 作者: 阿德 ...
- mvn package 和 mvn install
刚刚准备将maven项目中一个子项目打个包,使用了mvn package.心想这个很简单嘛,没料就报错了.报错咱不怕,看看错在哪就好了. 编译出错,找不到我定义的异常类中的配置.那应该是引用父模块出来 ...
- 迭代器&生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- PTA中如何出Java题目?
PTA中如何出Java题目? 很多第一次出题的老师,不知道Java在PTA中是如何处理输入的.写一篇文章供大家参考.比如以下这样的一个题目: 从控制台读入两个数,然后将其相加输出. 对于该题可以有如下 ...
- 学习笔记:Zookeeper选举机制
1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定master和slave 但是,zookeeper工作时,是有一个节点为leader,其他则为follower Leader ...
- Android碎裂的粒子效果
最近看到一段时间都没怎么更新文章了,一直在学习iOS相关内容.偶然间看到一个碎裂的粒子效果,觉得很有意思,就查了查,参考下网上的思路自己撸了个轮子. 好了,说了这么多,先看看效果吧~ 依惯例,先说下行 ...
- 计算机网络之IP协议族
网际协议IP 与IP协议配套使用的还有三个协议: 地址解析协议 ARP (Address Resolution Protocol) 网际控制报文协议 ICMP (Internet Control ...