Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to iterate over long path names with any form of the Windows API

I have some files on a server that exceed the MAX_PATH limit. I've repeatedly heard that you can list those files by pre-pending \\?\ to the path. However, that doesn't solve the problem with FindFirstFile[Ex] and its partners as they use a data structure that limits file name length to MAX_PATH.

Is there any other way to iterate over the directory structure to find the files that have a name that is too long? I've seen utilities that do it but none of them are available in source form.

Note that I have seen the blog entries from the .NET BCL folks and followed the links they provide.

I'd prefer to do this in C or C++ for simplicity but any freely available language will do for now.

Pointers to code, docs or anything useful are appreciated.

like image 945
JimR Avatar asked Jan 25 '11 11:01

JimR


1 Answers

I don't think there's a problem here. You are referring to the WIN32_FIND_DATA which does indeed return filenames limited in length to MAX_PATH. But since this is only the filename part, and the path is omitted, there is no limitation.

Within a directory, an object (file or folder) is limited in length, typically to 255 characters. You can determine what this limit is with the lpMaximumComponentLength parameter of GetVolumeInformation. I'd be surprised if any volume mounted in Windows could have a maximum component length in excess of 255.

The call to FindFirstFile receives a null-terminates string, lpFileName which specifies the directory and filename (e.g. "*.txt", say) to search. The documentation states:

In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 widecharacters, call the Unicode version of the function and prepend "\\?\" to the path.

like image 109
David Heffernan Avatar answered Oct 09 '22 18:10

David Heffernan