- 论坛徽章:
- 0
|
回复 #1 sakiola 的帖子
附源码:
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#define DIRMODE 0755
#define PATHLEN 4096
int isadir ( char * ); //测试过 系统中的文件夹被传入 可以按预想返回
void copy_file( char * , char * );//测试过 好用
void copy_dir ( char * , char * );
int main(int argc , char * argv[])
{
copy_dir( argv[1] , argv[2] );
return 0;
}
void copy_file(char * from , char * to)
{
int fromfd,tofd;
size_t nread;
char buf[BUFSIZ];
if ( (fromfd = open(from,O_RDONLY)) == -1 ){
perror("open from file error");
exit(1);
}
if ( (tofd = open(to, O_WRONLY | O_CREAT | O_TRUNC)) == -1 ){
perror("open to file error");
exit(2);
}
while( (nread = read(fromfd, buf, BUFSIZ)) > 0 )
if ( write(tofd, buf, nread) != nread || (nread == -1) ){
perror("write error");
exit(3);
}
close(fromfd);
close(tofd);
return;
}
int isadir(char * filename)
{
struct stat info;
if( stat(filename, &info) == -1 )
perror("stat");
if( S_ISDIR(info.st_mode) )
return 1;
else return 0;
}
void copy_dir( char * from_dirname , char * to_dirname )
{
DIR * dirp;
struct dirent * drent;
char buf[PATHLEN];
int i = 0;
if ( mkdir(to_dirname,DIRMODE) == -1 ){
perror("mkdir");
exit(1);
}
if ( chdir(to_dirname) == -1 ){
perror("chdir");
exit(1);
}
if ( (dirp = opendir(from_dirname)) == NULL ){
perror("opendir");
exit(1);
}
while( (drent = readdir(dirp)) != NULL ){
if( !strcmp(drent->d_name,"..") || !strcmp(drent->d_name,".") )//读取到 . 或者.. 不处理
continue;
if( getcwd(buf, PATHLEN) == NULL ){
perror("getcwd");
exit(1);
}
if( isadir(drent->d_name) ){
copy_dir( buf, drent->d_name);
}
else {
while( buf ) i++;
buf = '/';
strcat( buf, drent->d_name );
copy_file( buf, drent->d_name);
}
}
请问
1.我程序的逻辑有问题吗?
简单逻辑如下:
copydir()
{
if(获得文件夹文件名字并存在)
{
if(isadir)
copy_dir()
else copy_file()
}
}
2.为什么我调用mkdir 被创建出来的dir 通过 ls -l 查看是这样的?
d r-- --x--t 2
我给的权限分明是DIRMODE 0755 而这里为什么是d r-- --x--t这样的? 而且还有个t t位是干嘛的?
-----------------------好吧 ,这里是文件夹粘滞位的表示方式 那么为什么我没有指定粘滞位 而创建出了带有粘滞位的文件夹呢?
3.程序的运行时通过 ./exe a b来执行的 其中a是一个创建好的文件夹 结构如下a/b/c/d/e 不过为什么当
第一次调用 isadir(drent->d_name) drent->d_name的值为b的时候 返回的是0???
请达人帮忙看看 小的愚昧
[ 本帖最后由 sakiola 于 2009-9-30 13:37 编辑 ] |
|