【问题标题】:How can I obtain a case sensitive path on Linux without directory iteration?如何在没有目录迭代的情况下在 Linux 上获取区分大小写的路径?
【发布时间】:2011-12-11 08:43:07
【问题描述】:

鉴于已挂载的 cifs 文件系统 /network/cifs 不区分大小写,我如何使用 C 获取区分大小写的路径?

例如,fs 有一个文件/network/cfis/Adena/t.txt。给定/network/cfis/AdEnA/T.txt(正确解析),我想要/network/cfis/Adena/t.txt

我知道一种方法是递归迭代路径,以所有小写形式匹配它们,并获取目录迭代返回的实际大小写。但是,这涉及到很多我不想做的系统调用。

更改挂载选项不是解决方案。

如果这不可能,是否可以确定路径是否在不区分大小写的文件系统上?这样,除非需要,否则我可以避免进行递归目录迭代。

【问题讨论】:

    标签: c linux path posix cifs


    【解决方案1】:

    这个问题昨晚刚刚在 IRC 提出;我的回答是你必须迭代,原因是getcwd(可以通过在 Linux 中查看/proc/N/ 文件来实现)不能可靠地确定规范名称。 Linux CIFS 内核模块将使用您要求的外壳即时伪造 inode:

    ls -dli /mnt/foo /mnt/foO /mnt/fOo /mnt/FOo /mnt/FOO
    

    可以显示非常不同的值,因此,/proc/self/cwd 将反映这些 inode 之一,不一定是具有规范命名的那个。

    【讨论】:

      【解决方案2】:

      一个可能的解决方案是 open 读取文件,获取文件描述符,例如 23,然后到 readlink 伪文件 /proc/self/fd/23 (但也许那个技巧不会奏效,我没有尝试过)

      【讨论】:

        【解决方案3】:

        对于它的价值,这是一种适用于 OSX(但显然不适用于 Linux)的方法:

        #include <stdlib.h>
        char case_sensitive_path[1024];
        realpath("/network/cfis/AdEnA/T.txt", case_sensitive_path);
        // case_sensitive_path is now "/network/cfis/Adena/t.txt"
        

        【讨论】:

        • realpath 没有被指定为这样做。它只解析 .、.. 和符号链接。它在 Linux 上的实践对我也不起作用。
        • 谢谢。我只在 OSX 上尝试过,错误地认为行为是相同的。
        【解决方案4】:
        #include <stdlib.h>
        #include <stdio.h>  /* defines FILENAME_MAX */
        #ifdef WINDOWS
            #include <direct.h>
            #define GetCurrentDir _getcwd
        #else
            #include <unistd.h>
            #define GetCurrentDir getcwd
         #endif
        
        
        int main(void)
        {
           char buffer[FILENAME_MAX];
        
           chdir("/network/cfis/AdEnA");
           if (NULL == GetCurrentDir(buffer, FILENAME_MAX))
              perror("getcwd error");
           printf("The current directory is %s.\n", buffer);
           return 0;
        
        }
        

        【讨论】:

        • 如果传递的路径不是当前目录怎么办?
        • 啊,抱歉,Adena 是一个文件。所以这只是部分解决了它。我已经澄清了这个问题。
        • 我认为这不适用于 Windows 上的 Unicode 文件名。请改用 GetCurrentDirectoryW。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 2021-01-14
        • 1970-01-01
        相关资源
        最近更新 更多