QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1582|回复: 10

c语言中一个系统调用的问题

[复制链接]
发表于 2006-4-22 19:51:21 | 显示全部楼层 |阅读模式
我发现在使用opendir()打开一个目录文件的时候,不能够再通过opendir()打开相同目录中的一个子目录文件.是否有什么办法解决这个问题呢.我把总是出错的代码贴到下面的地址了,我想实现的功能是复制文件夹,其中由于38行中递归的调用了自己所以在打开子目录文件的时候就出错.请大家帮助解决,谢谢!
http://rafb.net/paste/results/oSu8Th69.html
发表于 2006-4-22 20:13:37 | 显示全部楼层
能不能编写一个测试程序,这样大家先运行一下也许更简单些。
回复

使用道具 举报

 楼主| 发表于 2006-4-23 09:57:14 | 显示全部楼层
噢我知道了,这里是整个程序,我想实现的功能是连同文件夹内的所由文件的各种属性一同复制的程序.使用方法是"./cpdir 原文件夹路径 要复制到的路径"
[code:1]
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <dirent.h>
#include <fcntl.h>
#include <unistd.h>

void cpdir(const char *src,const char *des);
void err_sys(const char* info);

void err_sys(const char* info)
{
/*        perror(info);*/
        printf(info);
        exit(1);
}

int main(int argc, char *argv[])
{
        struct stat *attrib; /*record the attrib of every file copied*/
        if(argc!=3)
        {
                printf("Usage: cpdir <src-dirtory> <des-dirtory>\n");
                exit(0);
        }
        else if(strcmp(argv[1],argv[2])==0||stat(argv[2],attrib)==0)
        {
                printf("Error: This program should not to be used to overwrite an exist dirtory!\n");
                exit(0);
        }
        lstat(argv[1],attrib);
        /*check if the file is a folder*/
        if(!S_ISDIR(attrib->st_mode))
        {
                printf("Error: The src-path you specificed is not a dirtory!\n");
                exit(0);
        }
        /*make the root folder which have the same mode of the src-dir*/
        if(mkdir(argv[2],attrib->st_mode))
        {
                printf("Error: Fail to create the folder!\nPlease check your permission and the memory space available!\n");
                exit(0);
        }
        /*chang the owner of the folder*/
        if(chown(argv[2],attrib->st_uid,attrib->st_gid))
        {
                printf("Error: Fail to assign the owner of the folder!\n");
                exit(0);
        }
        /*copy the files and folders in the folder*/
        cpdir(argv[1],argv[2]);
        return 0;
}

void cpdir(const char *src,const char *des)
/*src is the path of the folder in which the files is to be copied,des is the path of the folder which is already created*/
{
        struct stat *attrib;
        struct dirent *fname;
        int fd_src;
        int fd_des;
        char buf[BUFSIZ];
        int m;
        DIR *dp;
       
        int n;
        char *path_in_src;
        char *path_in_des;
       
        for(n=0;;)
                {
                        if((dp=opendir(src))==NULL)
                                err_sys("Open dirtory file error!\n");
                        seekdir(dp,n++);
                        if((fname=readdir(dp))==NULL) /*the end of the file*/
                        {
                                closedir(dp);
                                break;
                        }
                        if(strcmp(fname->d_name,"..")==0||strcmp(fname->d_name,".")==0)
                        {
                                closedir(dp);
                                continue;
                        }
                        /*get the path and mode of the source file*/
                        path_in_src=(char*)malloc(sizeof(char)*(strlen(src)+strlen(fname->d_name)+3));
                        strcpy(path_in_src,src);
                        strcat(path_in_src,"/\0");
                        strcat(path_in_src,fname->d_name);
                        lstat(path_in_src,attrib);
                        /*get the path of the destinated file*/
                        path_in_des=(char*)malloc(sizeof(char)*(strlen(des)+strlen(fname->d_name)+3));
                        strcpy(path_in_des,des);
                        strcat(path_in_des,"/\0");
                        strcat(path_in_des,fname->d_name);
                       
                        closedir(dp);
                       
                        if(S_ISDIR(attrib->st_mode)) /*if the src is a folder*/
                        {
                                if(mkdir(path_in_des,attrib->st_mode))
                                        err_sys("Create folder error!\n");
                                if(chown(path_in_des,attrib->st_uid,attrib->st_gid))
                                        err_sys("Assign folder to owner error!\n");
                                cpdir(path_in_src,path_in_des);
                        }
                        else
                        {
                                if((fd_des=creat(path_in_des,attrib->st_mode))==-1)
                                        err_sys("Create destinated file error!\n");
                                if((fd_src=open(path_in_src,0))==-1)/*open the file in readonly mode*/
                                        err_sys("Open source file error!\n");
                                while((m=read(fd_src,buf,BUFSIZ))>0)
                                        if(write(fd_des,buf,m)!=m)
                                                err_sys("Copy file error!\n");
                                close(fd_src);
                                close(fd_des);
                                if(chown(path_in_des,attrib->st_uid,attrib->st_gid))
                                        err_sys("Assign file to owner error!\n");
                        }
                        free(path_in_src);
                        free(path_in_des);
                }
}

[/code:1]
回复

使用道具 举报

发表于 2006-4-24 11:18:29 | 显示全部楼层
attrib没分配内存
回复

使用道具 举报

 楼主| 发表于 2006-4-24 23:29:09 | 显示全部楼层
thanks!
回复

使用道具 举报

发表于 2006-4-25 16:19:04 | 显示全部楼层
attrib 分配多少内存阿??怎么分配呢
回复

使用道具 举报

发表于 2006-4-25 20:52:48 | 显示全部楼层
attrib = malloc(sizeof(struct stat));
回复

使用道具 举报

发表于 2006-4-25 20:54:16 | 显示全部楼层
或者声明时不要声明成指针
struct stat attrib;
要用它的地址时就用&attrib
回复

使用道具 举报

发表于 2006-4-26 09:32:34 | 显示全部楼层
熊猫糊涂啦 有几个问题:

1. struct stat *attrib 在 main() 和 cpdir() 里面都有定义,
那么内存分配语句 attrib = malloc(sizeof(struct stat));  应该加在什么地方?main() 里面还是 cpdir()里面呢 ?还是两个都加?

2. 用不用指定它的类型呢??
例如 (stat*)attrib = malloc(sizeof((stat)*struct stat)); 、
我是看到 "path_in_src=(char*)malloc(sizeof(char)*(strlen(src)+strlen(fname->d_name)+3)); " 这条语句才知道要分配动态内存这玩意的,也不知道要注意那些细节问题

3. struct dirent *fname 不用分配内存吗??

4. 不用分配动态内存的方式行不行??比如定义一个 " (char*)buf[20] "然后“path_in_src=buf[20]”这样做的问题是不是在递归调用的时候会占用大量的空间呢??所以才用动态内存分配??

5. main() 里面为什么
if(mkdir(argv[2],attrib->st_mode))
   {
      printf("Error: ....!\n");
      exit(0);
   }”
呢??难道每次make folder成功是错误的??我的理解是
“ if(!mkdir(argv[2],attrib->st_mode)) ”才执行出错提示语句
同样的情况还发生在 “chown()”上,cpdir() 里面也是。
很有可能是我个人理解有问题,大家调教调教哦

拜托各位指点熊猫啦,谢谢
回复

使用道具 举报

发表于 2006-4-26 12:25:31 | 显示全部楼层
运行不出来啊...郁闷 :-( 楼主跑出来了没??
回复

使用道具 举报

发表于 2006-4-26 19:00:59 | 显示全部楼层
还是跑不出来.......好郁闷啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 18:32 , Processed in 0.068618 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表