在linux/unix下是否有相当于WinAPI的MAX_PATH?

And*_*ewR 61 c c++ unix linux posix

如果我想分配一个char数组(在C中),保证它足够大以容纳任何有效的绝对路径+文件名,它需要多大.

在Win32上,有MAX_PATH定义.Unix/linux的等价物是什么?

ste*_*anB 56

有一个PATH_MAX,但它有点问题.从realpath(3)手册页的bug部分:

此函数的POSIX.1-2001标准版本已被设计破坏,因为无法确定输出缓冲区solve_path的合适大小.根据POSIX.1-2001,大小为PATH_MAX的缓冲区就足够了,但PATH_MAX不必是定义的常量,可能必须使用pathconf(3)获得.并且询问pathconf(3)并没有真正帮助,因为一方面POSIX警告pathconf(3)的结果可能很大并且不适合mallocing内存,另一方面 pathconf(3)可能返回-1到表示PATH_MAX没有界限.


RBe*_*eig 44

到目前为止,关于*nix方面的其他答案似乎都是正确的,但我会在Windows上添加一个关于它的警告.

你被文件欺骗了(通过遗漏).

MAX_PATH确实定义了,甚至可能适用于存储在FAT或FAT32上的文件.但是,任何路径名都可以作为前缀,\\?\告诉Windows API忽略MAX_PATH并让文件系统驱动程序自己决定.之后,定义变得模糊.

添加到路径名称实际上是Unicode(以及UTS-16)的事实以及当使用"ANSI"API时,与内部Unicode名称之间的转换取决于一系列因素,包括当前代码页,你有一个混乱的秘诀.

有关Windows规则的详细说明,请访问MSDN.规则比我在这里总结的要复杂得多.

编辑:我改变\\.\,以\\?\在上面得益于KitsuneYMG评论.

Windows路径和命名空间很复杂.有些人甚至认为他们太复杂了.复杂性的一个来源是Win32(现在是Win64)API是一个位于Windows NT本机系统之上的子系统.

没有任何前缀的路径在最广泛的Windows平台上兼容.如果它被限制为7位ASCII字符,那么它与版本2.0左右的16位DOS兼容(每当引入子目录时,实际上可能在DOS 3中;但DOS 1.0只有根目录和\字符没有特别的意义).

\\?\前缀使路径名的平衡上逐字传递到相应的文件系统驱动程序,这是产生下降的限制的影响MAX_PATH人物.如果长路径名也在网络共享上,则可以使用扩展的UNC名称,并使用前缀\\?\UNC\server\share\而不是正常的UNC名称\\server\share\.使用此前缀限制了Win32和更高版本Windows平台的可移植性,但除非您需要在旧硬件上支持16位Windows,否则这不是一个大问题.

\\.\前缀是不同的动物.它允许访问超出一组特殊命名设备的设备对象,这些设备由Windows自动映射为特殊文件名到每个文件夹中.这些特殊名称包括CON,PRN,AUX,NUL,COM1,COM2,COM3,COM4,COM5,COM6,COM7,COM8,COM9,LPT1,LPT2,LPT3,LPT4,LPT5,LPT6,LPT7,LPT8和LPT9.请注意,无论是否使用扩展名,或者使用大写或小写的任何混合,所有这些名称都是特殊的.但是您可能安装了10个或更多COM端口.如果您使用USB调制解调器或USB串行端口适配器,则会很快发生这种情况,因为每个独特的基于USB的串行端口都将分配一个不同的COMn名称.如果您需要访问第50个串口,那么您只能使用名称,\\.\COM50因为COM50 不是像COM1 那样的特殊名称.

我上面引用的MSDN页面有区别,我在原始答案中输入了错误的前缀.

  • *`COM1`很特别,但`COM50`不是* - 又是愚蠢的MS设计的另一种情况. (3认同)

And*_*ewR 19

好吧,至少在Linux上,有:

  • PATH_MAX(定义于limits.h)

  • FILENAME_MAX(定义于stdio.h)

这两个都设置4096在我的系统上(x86 Linux).

更新::从这个glibc的手册一些信息

仅当系统对相关参数具有固定的统一限制时,才在limits.h中定义以下每个宏.如果系统允许不同的文件系统或文件具有不同的限制,则宏未定义; 使用pathconf或fpathconf查找适用于特定文件的限制

  • 我想最大值可能会因您使用的文件系统类型而异,这意味着运行时检查,而不是编译时常量. (2认同)

cda*_*rke 6

FILENAME_MAX是ISO C标准的一部分,适用于UNIX和Windows.但是,GNU C库文档包含以下警告:

"与PATH_MAX不同,即使没有实际限制,也会定义此宏.在这种情况下,它的值通常是一个非常大的数字.在GNU系统中总是如此.

使用备注:不要使用FILENAME_MAX作为存储文件名的数组的大小!你不可能制造出那么大的阵列!使用动态分配."


unw*_*ind 5

您可以pathconf()在运行时使用,但也有一个PATH_MAX预处理器定义<limits.h>.