2014-09-03 34 views
0

我有一個嵌入式Linux套件AM335x(運行angstrom 3.2.0,電腦運行Ubuntu 12.0.4),我可以插入一個USB閃存盤。嵌入式linux C代碼執行cp從USB驅動器到主機上的目錄保持目錄結構的方式

USB閃存盤有多個文件夾,子文件夾和文件。

我想創建一些C代碼將這些文件夾和文件從大容量存儲設備複製到我的套件上的文件系統。

我想在多個副本中這樣做,所以我可以檢查是否還有空間在我正在複製的文件系統中。

我發現了以下內容(請參閱下面的代碼)並試圖使用它。不幸的是,它不能保持複製時USB驅動器上的目錄結構完好無損。例如,如果我嘗試以下操作:複製(/media/sda1/foo/foo.txt,「/ home/Usb_Files」);複製(/media/sda1/foo/foo.txt,「/ home/Usb_Files」);

我看到foo.txt的在/home/Usb_Files/foo.txt而不是/home/Usb_Files/foo/foo.txt

另外,如果我嘗試複製(/media/sda1/foo/foo.txt ,「/ home/Usb_Files/foo」);

報告說,CP無法統計沒有這樣的文件或目錄

如何做到這一點任何想法?

我真的被卡住了。

int Copy(char *source, char *dest) 
{ 
    int childExitStatus; 
    pid_t pid; 
    int status; 
    if (!source || !dest) { 
    /* handle as you wish */ 
    } 

    pid = fork(); 

    if (pid == 0) { /* child */ 
    execl("/bin/cp", "/bin/cp", "-R", source, dest, (char *)0); 
    } 
    else if (pid < 0) { 
    /* error - couldn't start process - you decide how to handle */ 
    } 
    else { 
    /* parent - wait for child - this has all error handling, you 
    * could just call wait() as long as you are only expecting to 
    * have one child process at a time. 
    */ 
    pid_t ws = waitpid(pid, &childExitStatus, WNOHANG); 
    if (ws == -1) 
    { /* error - handle as you wish */ 
    } 
if(WIFEXITED(childExitStatus)) /* exit code in childExitStatus */ 
{ 
status = WEXITSTATUS(childExitStatus); /* zero is normal exit */ 
/* handle non-zero as you wish */ 
} 
else if (WIFSIGNALED(childExitStatus)) /* killed */ 
{ 
} 
else if (WIFSTOPPED(childExitStatus)) /* stopped */ 
{ 
} 
} 
} 

回答

0

發生這種情況是因爲您的嵌入式linux文件系統沒有foo目錄,因此您需要在複製之前創建foo目錄。

在進行任何操作之前,您需要添加邏輯以檢查目錄是否存在。

0

當你看着/media/sda1/foo/foo.txt你隱式知道你會將它分成兩部分/media/sd1a/foo/foo.txt - 問題是你如何將這些知識應用到你的程序中?例如,分界點總是第二個斜線還是其他規則? 一旦你有了這些信息,你會希望在最後一次斜槓前再次分割它(例如在這種情況下給出/foo) - 這會給你需要在目的地創建的目錄結構。請看mkdir -p來幫助解決(例如mkdir -p /home/Usb_Files/foo)。

+0

謝謝,這是我最終做的 – brent 2014-09-05 21:58:33