2013-04-29 120 views
0

我想在C中编写一个函数来将目录的内容复制到另一个目录。这是我到目前为止:C函数在UNIX中复制目录:文件无法复制

void *copydirectory(void *arg1, void *arg2) 
{ 
    int error; 
    struct dirent *direntp; 
    DIR *dirp_source, *dirp_destination; 
    char *source, *destination; 
    copy_t copy; 
    char filename[MAXNAME]; 

    // Set directory arguments 
    source = arg1; 
    destination = arg2; 
    fprintf(stderr, "Source directory is %s and destination directory is %s\n", source, destination); 

    // Open directories 
    if ((dirp_source = opendir(source)) == NULL) 
    { 
     fprintf(stderr, "Failed to open %s\n", source); 
     return 1; 
    } 

    if ((dirp_destination = opendir(destination)) == NULL) 
    { 
     perror("Failed to open destination directory"); 
     return 1; 
    } 

    // Read files in directory 
    while ((direntp = readdir(dirp_source)) != NULL) 
    { 
     copy.tid = pthread_self(); 
     fprintf(stderr, "now at line 64\n"); 

     // Copy source filename 
     if (snprintf(filename, MAXNAME, direntp->d_name) == MAXNAME) 
     { 
     fprintf(stderr, "Input filename %s is too long", direntp->d_name); 
     continue; 
     } 

     fprintf(stderr, "now at line 73\n"); 

     fprintf(stderr, "%s\n", filename); 
     // Open file for reading 
     if ((copy.args[0] = open(filename, R_FLAGS)) == -1) 
     { 
     fprintf(stderr, "Failed to open source file %s: %s\n", filename, strerror(errno)); 
     continue; 
     } 

     // Create destination filename for writing 
     if (snprintf(filename, MAXNAME, "%s", direntp->d_name) == MAXNAME) 
     { 
     fprintf(stderr, "Output filename %s is too long\n", direntp->d_name); 
     continue; 
     } 

     fprintf(stderr, "%s\n", filename); 
     // Open file for writing 
     if ((copy.args[1] = open(filename, W_FLAGS, W_PERMS)) == -1) 
     { 
     fprintf(stderr, "Failed to open destination file %s: %s\n", filename,  strerror(errno)); 
     continue; 
     } 

     if (error = pthread_create((&copy.tid), NULL, copyfilepass, copy.args)) 
     { 
     fprintf(stderr, "Failed to create thread: %s\n", strerror(error)); 
     copy.tid = pthread_self(); 
     } 
    } 

    // Close directory 
    while ((closedir(dirp_source) == -1) && (errno = EINTR)); 

    fprintf(stderr, "Successfully copied all files in directory \n"); 

} 

现在,为了测试,我只在名为dir1和dir2的文件夹中有2个目录。 dir1包含3个文件:file1,file2,file3。 但是,当我编译和运行代码,我得到的消息:

./ 
./ 
Failed to open destination file .: is a directory 
Failed to open source file file2: No such file or directory 
Failed to open source file file3: No such file or directory 
../ 
../ 
Failed to open destination file .: is a directory 
Failed to open source file file1: No such file or directory 

任何人有什么错什么建议?

回答

1

无法打开目标文件:是一个目录

你看这是因为你的源目录中包含的链接分别称为"."".."本身和它的父目录。您应该专门检查并避免这些条目。

无法打开源文件文件2:没有这样的FLE或目录

你看到这一点,因为你试图打开一个名为进程的当前工作目录"file2"文件,但不存在 - 您所在的文件位于源目录中。你需要建立文件名考虑到这一点:

// Copy source filename 
if (snprintf(filename, MAXNAME, "%s/%s", source, direntp->d_name) == MAXNAME) 
+0

因此,我改变了像你说的snprint函数,但我仍然得到相同的错误。我不太清楚添加“%s /%s”是什么 – zyxxwyz 2013-04-30 00:41:13

+1

@zyxxwyz:'direntp-> d_name'是源目录*中文件*的名称。如果你只是把它传递给'open()'函数,那么它不知道你想打开源目录中的文件 - 它会尝试在当前目录中打开它。相反,你需要建立''/''的路径,并将'* *传递给'open()'函数。 – caf 2013-04-30 01:09:01

+0

呃,我一直在尝试,但我不知道该怎么做。我真的不知道如何在C中使用路径。有没有更多的提示可以给我? – zyxxwyz 2013-04-30 01:18:05