2013-10-24 97 views
1

我試圖從我輸入到我的程序中的字符串生成目錄樹結構。字符串示例:從字符串生成目錄結構

/users/username/documents/folder/file.txt 

我想在預定文件夾內創建上述目錄結構,例如「備份」。如果使用得當,產生的目錄樹會是:

/backup/users/username/documents/folder/file.txt 

但我不想把所有的文件複製到「文檔」文件夾中或「文件夾」文件夾等。我想複製的唯一文件over是路徑末尾的單個文本文件。

我需要遍歷字符串的索引並使用「/」分隔它嗎?這似乎有點乏味,我想知道是否有更快的更有效的方法來編碼它?

+0

您正在使用哪個操作系統? – Baldrick

+1

這取決於您必須使用哪些系統調用來創建目錄。如果這是UNIX或Linux,則可以爲樹中的每個目錄調用mkdir()。從示例字符串中的任何目錄開始不存在。如果/ backup已經存在,請以/ backup/users開頭。 –

+0

在Windows下,使用SHCreateDirectoryEx窗口函數。它一次性創建路徑的所有缺失部分。 – Baldrick

回答

1

如果您想使用POSIX功能mkdir(2)您需要逐個創建丟失的目錄。

如果您準備稍微便攜一下 可以使用一個system調用完成。你怎麼做取決於你的操作系統。

在Linux/UNIX中,您可以使用mkdir -p在一次調用中創建所有丟失的目錄。

在Windows中,您可以使用SHCreateDirectoryEx(根據Baldrick的評論)。

0

我試圖編寫一個程序,執行上述工作,並找到以下工作。

您可以使用strtok()從輸入中提取所有單個目錄,併爲每個子目錄應用 mkdir()。最後/後面的字符串是文件名和我不知道是否有更好的方法來解析字符串使用strtok()我的方式:我調用一個函數countChars()(從https://stackoverflow.com/a/4235545/1024474借來)到確定路徑中/的數量以獲取要創建的文件夾數量,並相應地使用while循環來創建目錄。

最後,我使用creat()創建一個具有指定路徑的文件名的文件。在你的代碼中,你可以將原始文件的內容複製到新文件中。

下面的代碼假定您已經在預定backup/文件夾的路徑是一樣的東西users/username/documents/folder/file.txt

#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 

int countChars(char* s, char c) 
{ 
    return *s == '\0' 
       ? 0 
       : countChars(s + 1, c) + (*s == c); 
} 

int main(int argc, char **argv) { 

    mode_t mode = S_IRWXU; 

    umask(0); 

    char buffer[512]; 
    char *b; 
    char c[512]; 
    int n, i=0; 

    strcpy(buffer, argv[1]); 

    n = countChars(buffer, '/'); 

    printf("%d\n", n); 

    b = strtok(buffer, "/"); 

    while (i<n) 
    { 
    i++; 
    printf("%s\n", b); 
    if (mkdir(b, mode) == -1) { 
     printf("error when creating dir\n"); 
    } 
    chdir(b); 
    b = strtok(NULL, "/"); 
    } 

    if (creat(b, mode) == -1) { 
     printf("error when creating file\n"); 
    } 

    return 0; 

} 

如果文件夾已經存在,程序打印一個錯誤(即通知),但收益。