c - 在 Linux 上正则化 C 中不存在的路径

标签 c validation path

我正在为创建目录的 c 程序编写一个实用函数,但也会创建任何不存在的中间目录。我可以使用该代码,但我想将注意力转移到改进用户输入格式上。也就是说,我想在处理输入路径之前对其进行规范化,尤其是删除 // 这将破坏我当前的实现。

我知道 realpath(3),但我的主要问题是如果路径上的任何目录尚不存在,它将失败。命令行函数 realpath(1)-m 选项,这似乎可以满足我的要求,但如果可以避免,我不想调用 shell它(否则我可以执行 mkdir -p 并完成它)。 Gnu findutils/canonicalize.hcanonicalize_filename_mode,但我不知道如何引用直接复制源代码(不是不可能)。想法、建议?

我依赖于我的开发环境 gcc 4.7.7rhel 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/

相关文章:

c# - 在c#代码中可以使用斜杠作为路径吗

c - GTK+ 3 线程安全吗?

c - 我应该在什么情况下使用 malloc?我对什么时候应该在 C 中使用动态分配感到困惑

django - 在表单 clean() 方法中获取 POST 变量

VBA - 验证我的密码是否包含 1 个数字、1 个 ucase 和 1 个 lcase

python - 将带有反斜杠后跟数字的字符串转换为路径

c - 汇编中有关 win32 api 的帮助

c - 某种事件驱动程序

validation - 在插入 BigQuery 表之前检查数据是否已经存在(使用 Python)

python - Django,大整数和 url