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> ...
随机推荐
- ●POJ 3974 Palindrome(Manacher)
题链: http://poj.org/problem?id=3974 题解: Manacher 求最长回文串长度. 终于会了传说中的马拉车,激动.推荐一个很棒的博客:https://www.61mon ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 使用jquery.qrcode.js生成二维码
通常生成二维码的方式有两种:第一种是java代码的形式,第二种是通过Js方式. 在这里我做个记录,用js生成二维码,可以在官网下载源码:http://jeromeetienne.github.io/j ...
- 【Git】CentOS7 通过源码安装Git
yum源仓库里的Git版本更新不及时,最新版的Git是1.8.3,但是官方的最新版早已经更新到2.9.5.想要安装最新版本Git,只能下载源码进行安装 建议最好更新git为较新版本,便于使用 1.查看 ...
- Weekly Contest 75题解
Q1. Rotate String(796) We are given two strings, A and B. A shift on A consists of taking string A a ...
- AMD,CMD,UMD,CommonJS
http://www.jianshu.com/p/bd4585b737d7 http://www.jianshu.com/p/09ffac7a3b2c
- Axis2 webservice入门--Webservice的发布与调用
一.Webservice发布 参考 http://www.cnblogs.com/demingblog/p/3263576.html 二.webservice 调用 部分参考:http://www.c ...
- linux设置oracle自动启动
用root用户 在/etc/init.d/目录下创建Oracle的服务文件 cd /etc/init.d vi oracle11g 添加内容如下 #!/bin/bash # chkconfig ...
- AngularJs开发——指令与控制器间的通信
(原文:http://www.html5jscss.com/controller-between-directive.html) 指令与控制器之间通信,跟控制器间的通信.指令间通信也类似,也是下几种方 ...
- nginx的yum安装,基本参数使用,编译参数说明和Nginx基本配置,模块安装
nginx的yum安装从nginx官网获取源 vim /etc/yum.repose.d/nginx.repo[nginx]name=nginx repobaseurl=http://nginx.or ...