从字符串生成目录结构

时间:2013-10-24 12:03:07

标签: c tree directory structure

我正在尝试从我输入程序的字符串生成目录树结构。字符串示例:

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

我想在预定文件夹中创建上述目录结构,例如“备份”。完成后,生成的目录树将是:

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

但我不想复制“documents”文件夹或“folder”文件夹等内的所有文件。我想要复制的唯一文件是路径末尾的单个文本文件。

我是否必须遍历字符串的索引并使用“/”分隔它?这似乎有点乏味,我想知道是否有更快捷的方法来编码它?

2 个答案:

答案 0 :(得分:1)

如果要使用POSIX函数mkdir(2),则需要逐个创建缺少的目录。

如果你准备好便携一点 可以通过一次system电话完成。你如何做到这取决于你的操作系统。

在Linux / UNIX中,您可以使用mkdir -p在一次通话中创建所有缺少的目录。

在Windows中,您可以使用SHCreateDirectoryEx(根据Baldrick的评论)。

答案 1 :(得分: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;

}

如果文件夹已经存在,程序会输出错误(即通知),但会继续。