免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3622 | 回复: 4
打印 上一主题 下一主题

[C] 关于拷贝文件夹(未解决) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-30 11:52 |只看该作者 |倒序浏览
假如我有如下文件夹:
a
如何将a拷贝为
b?

不要告诉我用cp -rf a b

我要的是程序上的 C实现

自己写了一份 不过还有些问题

比如说

if ( mkdir("b",0755) == -1 ){
                perror("mkdir");
                exit(1);
        }
为什么我调用mkdir 被创建出来的dir 通过 ls -l 查看是这样的?

dr----x--t 2 root root 4096 Sep 30 17:55 b

我给的权限分明是DIRMODE 0755 而这里为什么是d r-- --x--t这样的? 而且还有个t t位是干嘛的?

而且还标志2 文件夹的2也表示硬连接数?

[ 本帖最后由 sakiola 于 2009-9-30 12:58 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-30 12:55 |只看该作者

回复 #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 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-09-30 13:46 |只看该作者
大侠们都不在吗?

这段代码在传copy_dir参数的时候 还有待确定 不过 为什么 第一次创建出来的文件夹会带有粘滞位?我没指定要创建带有粘滞位的文件夹啊

?????

[ 本帖最后由 sakiola 于 2009-9-30 14:39 编辑 ]

论坛徽章:
1
天蝎座
日期:2014-02-28 16:08:53
4 [报告]
发表于 2009-10-09 21:02 |只看该作者
buf = '/';

论坛徽章:
0
5 [报告]
发表于 2009-10-10 16:10 |只看该作者
自己实现这个递归逻辑没必要。POSIX有个标准目录遍历函数: nftw()
至于mkdir的权限问题,应该是你shell的umask的问题。你可以man umask一下

PS:你问问题的语气很不好,“不要告诉我用cp -rf a b,我要的是程序上的 C实现”。告诉你用cp也是一种解决方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP