2013-04-29 54 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