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页面有区别,我在原始答案中输入了错误的前缀.
And*_*ewR 19
好吧,至少在Linux上,有:
PATH_MAX(定义于limits.h)
FILENAME_MAX(定义于stdio.h)
这两个都设置4096在我的系统上(x86 Linux).
更新::从这个glibc的手册一些信息
仅当系统对相关参数具有固定的统一限制时,才在limits.h中定义以下每个宏.如果系统允许不同的文件系统或文件具有不同的限制,则宏未定义; 使用pathconf或fpathconf查找适用于特定文件的限制
FILENAME_MAX是ISO C标准的一部分,适用于UNIX和Windows.但是,GNU C库文档包含以下警告:
"与PATH_MAX不同,即使没有实际限制,也会定义此宏.在这种情况下,它的值通常是一个非常大的数字.在GNU系统中总是如此.
使用备注:不要使用FILENAME_MAX作为存储文件名的数组的大小!你不可能制造出那么大的阵列!使用动态分配."