【问题标题】:Generating directory structure from string从字符串生成目录结构
【发布时间】:2023-03-19 17:56:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 您使用的是哪个操作系统?
  • 这取决于您必须使用什么系统调用来创建目录。如果这是 UNIX 或 Linux,您将为树中的每个目录调用 mkdir()。从示例字符串中不存在的任何目录开始。如果 /backup 已经存在,请从 /backup/users 开始。
  • 在Windows下,使用SHCreateDirectoryEx windows函数。它一次性创建路径的所有缺失部分。
  • 我在 MAC OS X 上使用 gcc 编译器

标签: c tree directory structure


【解决方案1】:

如果你想使用POSIX函数mkdir(2)你需要一个一个创建缺失的目录。

如果您准备不那么便携 它可以通过一个system 调用来完成。具体如何操作取决于您的操作系统。

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

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

【讨论】:

    【解决方案2】:

    我尝试编写一个完成上述工作的程序,发现以下一个可以工作。

    您可以使用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;
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2015-10-23
      相关资源
      最近更新 更多