如何在没有目录迭代的情况下在Linux上获取区分大小写的路径?

时间:2011-12-11 08:43:08

标签: c linux path posix cifs

如果挂载的cifs文件系统/network/cifs不区分大小写,那么如何使用C获取区分大小写的路径?

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

我知道一种方法是在路径上递归迭代,在所有小写中匹配它们,并获得目录迭代返回的实际情况。但是,这涉及很多我不愿意做的系统调用。

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

#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;

}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

对于它的价值,这是一种适用于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"