The rest of the answers still seem correct with respect to the * nix side, but I will add a warning about this on Windows.
In accordance with the documentation you are accused (by omission).
MAX_PATH indeed defined and may even apply to files stored on FAT or FAT32. However, any path name may be prefixed with \\?\ To tell the Windows API to ignore MAX_PATH and allow the file system driver itself. After this, the definitions become fuzzy.
Add to the confusion the fact that the path names are actually Unicode (well, UTS-16) and that when using the "ANSI" API, the conversion to and from the Unicode internal name depends on many factors, including the current code page, and you have recipe for confusion.
A good description of the rules for Windows is MSDN . The rules are much more complicated than here.
Edit: I changed \\.\ To \\?\ In the above KitsuneYMG comment example.
Windows paths and namespaces are complex. Some may even argue that they are too complex. One source of complexity is that the Win32 (and now Win64) API is a subsystem that sits on top of its own Windows NT system.
The prefix-free path is compatible with a wide range of Windows platforms. If it is limited to 7-bit ASCII characters, then it is compatible with 16-bit DOS from version 2.0 or so (whenever subdirectories that could have been in DOS 3, but in DOS 1.0 there were only root directories, and \ didn't really matter).
The prefix \\?\ MAX_PATH path name balance to be transferred verbatim to the corresponding file system driver, which gives the effect of dropping the restriction on MAX_PATH characters. If the long path name is also included in the network share, you can use the UNC extended name for it with the prefix \\?\UNC\server\share\ instead of the usual UNC name \\server\share\ . Using this prefix limits portability for Win32 and later Windows platforms, but if you don't need 16-bit Windows support on legacy hardware, this is not a big problem.
The prefix \\.\ Is another animal. It allows you to access device objects outside of a set of specially named devices that are automatically mapped to Windows as special file names in each file folder. These special names include CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 and LPT9. Note that all of these names are special regardless of whether the extension is used or in any combination of upper or lower case. But it is possible that you have 10 or more COM ports installed. This happens quickly if you play with USB modems or USB serial adapters, as each unique USB serial port will be given a separate COMn name. If you need to access the 50th serial port, you can only do this with the name \\.\COM50 , because COM50 is not a special name, for example COM1.
The MSDN page above was eligible for a difference, I just typed the wrong prefix in my original answer.