如果挂载的cifs文件系统/network/cifs
不区分大小写,那么如何使用C获取区分大小写的路径?
例如,fs有一个文件/network/cfis/Adena/t.txt
。给定/network/cfis/AdEnA/T.txt
(正确解析),我想要/network/cfis/Adena/t.txt
。
我知道一种方法是在路径上递归迭代,在所有小写中匹配它们,并获得目录迭代返回的实际情况。但是,这涉及很多我不愿意做的系统调用。
更改装载选项不是解决方案。
如果无法做到这一点,是否可以确定路径是否在不区分大小写的文件系统上?这样我就可以避免进行递归目录迭代,除非需要。
答案 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)
答案 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"