LinuxWindows系统路径长度限制,PATH_MAXMAX_PATH内能建多长路径?
摘要:问题的提出 在处理文件系统路径的时候,我们一般会先开辟一块内存区,用来接收路径、或者拼接好路径传递给系统调用。这是因为路径在各个系统上都有最大长度限制,在 Windows 上这个值是 MAX_PATH,一般不能超过 260;在 Linux
问题的提出
在处理文件系统路径的时候,我们一般会先开辟一块内存区,用来接收路径、或者拼接好路径传递给系统调用。这是因为路径在各个系统上都有最大长度限制,在 Windows 上这个值是 MAX_PATH,一般不能超过 260;在 Linux 上这个值是 PATH_MAX,一般不能超过 4096 (或者通过 pathconf (_PC_PATH_MAX, ...) 来获取,但是一般也是 4096),就像下面这段典型的代码:
1 int main ()
2 {
3 #ifdef WIN32
4 char buf[MAX_PATH + 1] = { 0 };
5 if (GetModuleFileNameA(NULL, buf, MAX_PATH) == 0)
6 {
7 printf("get current module path failed, errno %d", GetLastError());
8 return -1;
9 }
10 #else
11 char buf[PATH_MAX + 1] = { 0 };
12 if (readlink("/proc/self/exe", buf, PATH_MAX) < 0)
13 {
14 printf("read exe path failed, errno %d", errno);
15 return -1;
16 }
17 #endif
18
19 printf("current executable file path: %s\n", buf);
20 return 0;
21 }
它用来获取当前可执行文件的完整路径。在 Windows 与 Linux 上分别调用了 GetModuleFileName 与 readlink 系统调用,且事先在栈上分配了接收完整路径的内存区 buf。最后将成功获取的路径打印到控制台。在两种系统上,输出分别如下:
Windows
current executable file path: E:\code\apue\02.chapter\Release\path_max.exe
Linux
current executable file path: /home/yunhai/code/apue/02 .chapter /path_max
其它与路径相关的调用也是类似的。那么问题来了,这个最大路径长度是为了方便程序编写 (不然需要动态分配内存,且需要两次调用,其中一次用于获取最终的路径长度),还是说底层的文件系统就只能支持这么长的路径呢?
问题的验证
为了弄清楚这个问题,我专门写了一个测试程序:
path_max.c
1 #ifdef WIN32
2 # ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows Vista。
3 # define _WIN32_WINNT 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
