【问题标题】:Getting folder from a path从路径获取文件夹
【发布时间】:2014-07-07 18:09:16
【问题描述】:

假设我有一个字符串形式的路径(比如这个):

/ROOT/DIRNAME/FILE.TXT

如何获取 file.txt 的父文件夹(本例中为 DIRNAME)?

【问题讨论】:

  • 参见:man basenameman dirname
  • Parent directory of a file 的可能重复项
  • 您在什么情况下需要它?如果它是一个字符串,您可以使用正则表达式。如果在控制台中,您可以使用上面提到的 basename 或 dirname

标签: c directory


【解决方案1】:

对于应该至少包含一个目录的路径:

char str[1024];   // arbitrary length. just for this example
char *p;
strcpy(str, "/ROOT/DIRNAME/FILE.TXT");  // just get the string from somewhere
p = strrchr(str, '/');
if (p && p != str+1)
{
    *p = 0;
    p = strrchr(p-1, '/');
    if (p) 
        print("folder : %s\n", p+1);  // print folder immediately before the last path element (DIRNAME as requested)
    else
        printf("folder : %s\n", str);  // print from beginning
}
else
    printf("not a path with at least one directory in it\n");

【讨论】:

  • 这是我一直在寻找的解决方案。谢谢。
【解决方案2】:

使用strrchr 定位最后出现的/。将字符串开头的所有内容复制到找到的位置。代码如下:

char str[] = "/ROOT/DIRNAME/FILE.TXT";
char * ch = strrchr ( str, '/' );
int len = ch - str + 1;
char base[80];
strncpy ( base, str, len );
printf ( "%s\n", base );

只使用字符串;不了解符号链接或假定的其他类型。

【讨论】:

    【解决方案3】:

    您也可以简单地使用指针来完成。只需迭代到路径的末尾,然后备份,直到遇到/,用空终止字符替换它,然后打印字符串:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main (int argc, char *argv[]) {
    
        if (argc < 2 ) {
            fprintf (stderr, "Error: insufficient input, usage: %s path\n", argv[0]);
            return 1;
        }
    
        char *path = strdup (argv[1]);
        char *p = path;
    
        while (*p != 0) p++;
    
        while (--p)
            if (*p == '/') {
                *p = 0;
                break;
            }
    
        printf ("\n  path = %s\n\n", path);
    
        if (path) free (path);
    
        return 0;
    
    }
    

    输出:

    $ ./bin/spath "/this/is/a/path/to/file.txt"
    
    path = /this/is/a/path/to
    

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2013-06-16
      相关资源
      最近更新 更多