1

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

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

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

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

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

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

4

2 回答 2

1

如果要使用 POSIX 功能,则mkdir(2)需要一一创建缺少的目录。

如果您准备减​​少便携性,则可以通过一次system调用来完成。你怎么做取决于你的操作系统。

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

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

于 2013-10-24T12:32:26.813 回答
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;

}

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

于 2013-10-24T14:42:42.650 回答