我正在尝试从我输入程序的字符串生成目录树结构。字符串示例:
/users/username/documents/folder/file.txt
我想在预定文件夹中创建上述目录结构,例如“备份”。完成后,生成的目录树将是:
/backup/users/username/documents/folder/file.txt
但我不想复制“documents”文件夹或“folder”文件夹等内的所有文件。我想要复制的唯一文件是路径末尾的单个文本文件。
我是否必须遍历字符串的索引并使用“/”分隔它?这似乎有点乏味,我想知道是否有更快捷的方法来编码它?
答案 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;
}
如果文件夹已经存在,程序会输出错误(即通知),但会继续。