我正在为创建目录的 c 程序编写一个实用函数,但也会创建任何不存在的中间目录。我可以使用该代码,但我想将注意力转移到改进用户输入格式上。也就是说,我想在处理输入路径之前对其进行规范化,尤其是删除 //
这将破坏我当前的实现。
我知道 realpath(3)
,但我的主要问题是如果路径上的任何目录尚不存在,它将失败。命令行函数 realpath(1)
有 -m
选项,这似乎可以满足我的要求,但如果可以避免,我不想调用 shell它(否则我可以执行 mkdir -p
并完成它)。 Gnu findutils/canonicalize.h
有 canonicalize_filename_mode
,但我不知道如何引用直接复制源代码(不是不可能)。想法、建议?
我依赖于我的开发环境 gcc 4.7.7
和 rhel 6.6
。
下面是我当前的实现。
static int do_mkdir(const char *path, mode_t mode) {
struct stat st;
int status = 0;
if ( stat(path, &st) != 0 ) {
errno = 0;
if (mkdir(path, mode) != 0 && errno != EEXIST)
status = -1;
} else if ( !S_ISDIR(st.st_mode) ) {
errno = ENOTDIR;
status = -1;
}
return(status);
}
int mkpath(const char *path, mode_t mode) {
char *pp;
char *sp;
int status;
char copypath[PATH_MAX+1];
copypath = realpath(path, copypath);
status = 0;
pp = copypath;
if(copypath == NULL)
status = -1;
while ( status == 0 && (sp = strchr(pp, '/')) != 0 ) {
if (sp != pp) {
*sp = '\0';
status = do_mkdir(copypath, mode);
*sp = '/';
}
pp = sp + 1;
}
if ( status == 0 )
status = do_mkdir(path, mode);
return (status);
}
最佳答案
它可能无法完全回答您的问题,但这里有一个替代方案:
您可以使用 strtok
处理 path
字符串,将 delim
参数设置为 '/'
。
通过这样做,strtok
将返回中间目录名称(以 null 结尾:您可以摆脱 \0
调整)并且它会优雅地忽略 //
。
然后您可以添加“清理”检查(查找无效字符、路径名太长等...)
关于c - 在 Linux 上正则化 C 中不存在的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28863090/