分区复制1
来源:互联网 发布:plsql查看数据库ip 编辑:程序博客网 时间:2024/04/28 19:23
/*******************************************************/
fastcopy.c
基于文件系统的分区复制
/*******************************************************/
#include "beinclude.h"
int pathlen;
char buf[BUFSIZE];
struct aa finfo;
int main(int ac, char *av[]){
char cmd[50];
char *srcdev,*decdev;
struct stat st;
//DIR *sdir=NULL, *ddir=NULL;
//struct dirent diret, *diret_ptr;
if (ac < 2){
printf("the operate to less /n");
return -1;
}
memset(cmd, 0x00, sizeof(cmd));
srcdev = av[1];
decdev = av[2];
sprintf(cmd, "mount %s /data/sdev",av[1]);
system(cmd);
memset(cmd, 0x00, sizeof(cmd));
sprintf(cmd, "mount %s /data/ddev",av[2]);
system(cmd);
lstat(DEVS, &st);
if (!S_ISDIR(st.st_mode)){
printf("%s errpo@@@/n",DEVS);
return -1;
}
//if (ddir = opendir())
pathlen = strlen(srcdev);
if (scan_dir(DEVS, DEVD, &st) >= 0){
system("umount /data/sdev");
system("umount /data/ddev");
}
return 0;
}
int scan_dir(char *s, char *d, struct stat *fstat){
int retval = 0;
int rest;
struct dirent diret, *diret_ptr;
char filename[PATH_MAX],dfilename[PATH_MAX];
DIR *sdir=NULL, *ddir=NULL ,*sdirbak=NULL, *ddirbak=NULL;
if (!S_ISDIR(fstat->st_mode)){
printf("***%s is not a directy",s);
return -1;
}
//ddir = opendir(d);
//printf("######### s:%s ############# d:%s ##############/n",s,d);
if ((sdir = opendir(s)) == NULL){
printf("opendir %s error: %s/n",s, strerror(errno));
return (-1);
}
if ((ddir = opendir(d)) == NULL){
fprintf(stderr,"opendir %s error:%s/n",d,strerror(errno));
return (-1);
}
sdirbak = sdir;
ddirbak = ddir;
while(!(retval = readdir_r(sdir, &diret, &diret_ptr)) ){
struct stat dirinfo;
int filelen;
if (diret_ptr == NULL){
printf("readdir_r:%s error /n",diret.d_name);
break;
}
if ( (strncmp(diret.d_name, ".", PATH_MAX) == 0) ||
(strncmp(diret.d_name, "..", PATH_MAX) == 0)){
//retval = readdir_r(sdir, &diret, &diret_ptr);
continue;
}
filelen = strlen(diret.d_name);
if (filelen+pathlen > PATH_MAX){
printf("file name too long/n");
}
printf("@@@@ current dire:%s @@@@ /n",diret.d_name);
if (strcmp(s, "/")){
sprintf(filename,"%s/%s",s,diret.d_name);
sprintf(dfilename,"%s/%s",d,diret.d_name);
}else {
sprintf(filename,"/%s",diret.d_name);
sprintf(dfilename,"/%s",diret.d_name);
}
lstat(filename, &dirinfo);
memset(&finfo, 0x00, sizeof(&finfo));
memset(dfilename, 0x00, sizeof(dfilename));
sprintf(finfo.name, "%s",diret.d_name);
sprintf(dfilename,"%s/%s",d,diret.d_name);
printf("w:%s/n/n",dfilename);
//memcpy(&finfo->fstat, &dirinfo, sizeof(dirinfo) );
if (S_ISDIR(dirinfo.st_mode)){
printf("################It is a direct: %s /n", filename);
if (readops(filename, &dirinfo, dfilename) < 0){
printf("read directory %s error /n",filename);
}
rest = scan_dir(filename, dfilename, &dirinfo);
if (rest < 0){
printf("scan %s failed /n",filename);
}
continue;
}
else {
printf("%s not a directory /n",filename);
if (readops(filename, &dirinfo, dfilename) < 0){
printf("read reg file:%s error /n",filename);
}
}
}
while (closedir(sdirbak) != 0);
while (closedir(ddirbak) != 0);
return 0;
}
int readops(char *fname, struct stat *info, char *dname){
int red;
int rfd,wfd;
if(!S_ISREG(info->st_mode)){
if (S_ISDIR(info->st_mode)){
//mkdir(dname, 0644);
mkdir(dname, info->st_mode);
}else if (S_ISFIFO(info->st_mode)){
//mkfifo(dname, 0644);
mkdir(dname, info->st_mode);
}else if (S_ISSOCK(info->st_mode)){
mknod(dname, info->st_mode, info->st_rdev);
}else if ((S_ISBLK(info->st_mode))||(S_ISCHR(info->st_mode))){
mknod(dname, info->st_mode, info->st_rdev);
}else if (S_ISLNK(info->st_mode)){
readlink(fname, buf, BUFSIZE);
symlink(buf, fname);
}
rebak_mod(dname, info);
return 0;
}
if ((rfd = open(fname, O_RDONLY|O_NONBLOCK)) == -1){
printf("open %s error:%s",fname,strerror(errno) );
return -1;
}
if ((wfd = open(dname, O_WRONLY|O_CREAT|O_TRUNC)) == -1){
printf("open write file %s error:%s /n",dname,strerror(errno));
return -1;
}
do{
red = read(rfd, buf, BUFSIZE);
printf("readed :%d /n",red);
if(red < 0){
perror("read error: ");
break;
}else if(red == 0){
printf("read over /n");
break;
}
write(wfd, buf, red);
}while(1);
//if (red < 0)
// return -1;
close(rfd);
close(wfd);
rebak_mod(dname, info);
sync();
return 0;
}
int rebak_mod(char *fname, struct stat *bakmod){
struct utimbuf timebak;
int ret;
if (S_ISLNK(bakmod->st_mode)){
ret = lchown(fname, bakmod->st_uid, bakmod->st_gid);
}
else
ret = chown(fname, bakmod->st_uid, bakmod->st_gid);
if (ret < 0){
printf("can not change file:%s's owner/n",fname);
}
if (!S_ISLNK(bakmod->st_mode)){
ret = chmod(fname, bakmod->st_mode);
}
if (ret < 0 ){
printf("can not change file:%s mode/n",fname);
}
timebak.actime = bakmod->st_atime;
timebak.modtime = bakmod->st_mtime;
if (utime(fname, &timebak) < 0){
printf("can not change file:%s time/n",fname);
}
return 0;
}
/*********************************************************************
*binclude.h
*********************************************************************/
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
//#include <unistd.h>
#include <dirent.h>
#include <utime.h>
#include <pthread.h>
#include <sys/ipc.h>
#define DEVS "/data/sdev"
#define DEVD "/data/ddev"
#ifndef PATH_MAX
#define PATH_MAX 256
#endif
#define BUFSIZE 1024*1024
typedef struct aa{
struct stat statbak;
char name[NAME_MAX];
int flags;
}g_file_inf;
- 分区复制1
- 复制分区的 VBScript 代码示例
- Oracle 大数据量复制 分区解决方式
- 在NTFS分区中复制文件而不丢失权限
- ntfsclone (实现硬盘上不同分区之间Windows 复制)
- SQL Server 2008 复制 分区SWITCH清理数据
- [Oracle] 分区探索(1) - 分区剪枝
- DB2数据库分区(1)
- sqlserver分区研究1
- win8.1分区
- 分区建表1
- 分区
- 分区
- 分区
- 分区
- 分区
- 分区
- 分区
- flex学习经验
- C# p/invoke: marshaling class between C# and C++ class
- 天津街老街改造8月开工
- linux脚本学习笔记
- 外包网站
- 分区复制1
- 全方位视觉运行环境
- 在Word中设置页面B5的问题
- 微软亚洲研究院的“三好”实习生
- 异常捕获
- 有多少人真正了解document.getElementById?
- 计算机等级考试二级C语言模拟试题(1)及答案
- 统计图控件dotnetCharting和ZedGraph比较
- 一篇回答了地震以来大部分问题的帖子(转)