2014-07-07 75 views
0

我有一個文本文件,名稱爲約800個文件,我想從一個文件夾傳輸到另一個文件夾。基本上,文本文件看起來像這樣:如何在UNIX下使用(C)將文件從一個文件夾傳輸到另一個文件夾?

file1.aaa (End of line) 
file2.aaa 
.. 
etc 

我做了這個代碼,使用功能「重命名」,每個人都在互聯網上建議:

#define _GNU_SOURCE 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main (void) 
{ 
    FILE *file = fopen ("C:\\Users\\blabla\\ListOfFiles.txt", "r"); 
    char path1[100] = "C:\\blabla\\folder1\\"; 
    char path2[100] = "C:\\blabla\\folder2\\"; 
    char *s1; 
    char *s2; 

    char line [20]; /* the file names won't be any longer than that */ 
    while(fgets(line, sizeof line,file) != NULL) 
    { 
     char *filePath1 = (char *) malloc((strlen(path1) + strlen(line) + 1) * sizeof(char)); 
     char *filePath2 = (char *) malloc((strlen(path2) + strlen(line) + 1) * sizeof(char)); 
     filePath1 = strcpy(filePath1, path1); 
     filePath2 = strcpy(filePath2, path2); 
     strcat(filePath1,line); 
     strcat(filePath2,line); 


     if (rename(filePath1, filePath2) != 0) 
     { 
      perror("wrong renaming"); 
      getchar(); 
     } 

     free(filePath1); 
     free(filePath2); 

    } 

    fclose (file); 

    return 0; 
} 

現在,當我打印的文件路徑,我得到預期的結果,但程序在運行'rename'函數時會停止運行,因爲參數問題無效。 我看着http://www.cplusplus.com/,注意到它說rename()的參數應該是const char *,難道這是問題的來源嗎?但是如果是這樣,我不明白我怎樣才能將我的參數變成'const',因爲我在閱讀我的初始文本文件時需要更新它們。

+1

你解決了一個普遍問題,還是你真的只想複製一組文件?您的操作系統將擁有*遠遠優越的*工具。 –

+0

是否想編寫C或C++代碼? – TWE

+1

使用您的操作系統的外殼。你將在十分鐘內完成這項工作。這應該有所幫助:[使用FOR命令複製文本文件中列出的文件](http://www.sidesofmarch.com/index.php/archive/2004/03/30/using-the-for-command-to -copy-files-listed-in-a-text-file /) – Krumia

回答

0

構建文件路徑的代碼非常複雜,但應該可行。爲了簡化它,請刪除malloc()並只使用兩個靜態大小的數組。此外,未來,please don't cast the return value of malloc() in C

您誤會了const這個事情,這意味着rename()不會改變它的兩個參數指向的字符。這是一種說法:「這兩個指針指向只輸入此函數的數據,不會嘗試從函數內部修改該數據」。在可能的情況下,您應該始終使用const參數指針,這有助於使代碼更清晰。

如果您收到「無效參數」,可能意味着文件沒有找到。打印出文件名以幫助您驗證。

+0

感謝您澄清常量事情的工作原理。 文件路徑是正確的,據我所知,通過打印他們 – Nicolas

相關問題