Bug in cGetFile()

Post Reply
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Bug in cGetFile()

Post by Enrico Maria Giordano »

This is a sample (try to select text.txt):

Code: Select all

#include "Fivewin.ch"


FUNCTION MAIN()

    LOCAL cDir := REPLICATE( "X", 128 )

    LMKDIR( cDir )

    MEMOWRIT( cDir + "\" + "test.txt", "This is a test" )

    ? CGETFILE32( "All files (*.*)|*.*", "Select a file", , CURDRIVE() + ":\" + CURDIR() + "\" + cDir )

    RETURN NIL
The problem seems to be that the memory allocated for the selected path+filename is limited to 128 bytes while the maximum length allowed by the file system is 256.

EMG
User avatar
modicr
Posts: 207
Joined: Fri Oct 07, 2005 7:58 am
Location: ljubljana, barje, slovenia
Contact:

Post by modicr »

I confirm:
http://fivetechsoft.com/forums/viewtopi ... t=cgetfile

BTW, in your source you use cGetFile32.

Roman
© I'm not patented!
User avatar
modicr
Posts: 207
Joined: Fri Oct 07, 2005 7:58 am
Location: ljubljana, barje, slovenia
Contact:

Post by modicr »

Hello!
... while the maximum length allowed by the file system is 256.
"How can I use path names longer than 255 characters?"
http://www.windowsitpro.com/Article/Art ... 14607.html
A. Windows NT has a maximum path size defined as MAX_PATH which is 255 characters. It is possible to use more characters by calling the wide (W) version of CreateFile and prefixing "\\?\" to the path. The "\\?\" tells the function to turn off path parsing. This lets you use paths that are nearly 32,000 Unicode characters long. You must use fully-qualified paths with this technique. This also works with UNC names.

The "\\?\" is ignored as part of the path.

For example, "\\?\D:\documents\faq.txt" is seen as "D:\documents\faq.txt".

Programs expecting to find legal file lengths may fall over attempting to open a file with a long path. If, for example the buffer they are putting the path into expects a legal file length.
http://www.osronline.com/showThread.CFM?link=91868
The maximum length of a file/folder is a problem. Almost everything in
Windows uses a MAXIMUM_FILENAME_LENGTH of 256 and MAX_PATH of 260. But
there is also a MAXPATHLEN parameter which is 1024. Any single element of
the path is limited to 255 characters.

But the Unicode versions of several functions permit a maximum path length
of 32,767 characters, composed of components up to 255 characters in length.
To specify such a path, use the "\\?\" prefix. For example,
"\\?\D:\<path>". But many functions don't handle this.

So 260 *usually* works, but 32K is guaranteed to work. (Note that this is
characters, not bytes -- each Unicode character is 2 bytes.)
http://www.cygwin.com/ml/cygwin/2004-10/msg01330.html
CreateFileA on an nt-based system just converts all strings from MBCS to
Unicode via the current locale's code page, and then calls CreateFileW.
CreateFileA is always limited to MAX_PATH.

On Win98/WinME, it works differently. There is no routine called
NtCreateFile.

CreateFileW is a dummy routine that always returns an error, unless you
link with the Microsoft Layer for Unicode (Unicows.dll). Unicows.dll
translates all UNICODE argument strings to the current code page, and
calls CreateFileA.

So you can always link with CreateFileW, since it always exists, but it
may not be functional.

The special \\?\ prefix doesn't do what you want on Win9x systems, as you
always go through CreateFileA, so paths are always limited to MAX_PATH.
http://msdn.microsoft.com/library/defau ... a_file.asp

Roman
© I'm not patented!
User avatar
Enrico Maria Giordano
Posts: 7355
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Contact:

Re: Bug in cGetFile()

Post by Enrico Maria Giordano »

EnricoMaria wrote:The problem seems to be that the memory allocated for the selected path+filename is limited to 128 bytes while the maximum length allowed by the file system is 256.
Replacing all 128 to 256 and all 127 to 255 in getfile.c solves the problem.

EMG
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Enrico,

Thanks! :)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Vladimir Grigoriev
Posts: 54
Joined: Fri Oct 21, 2005 10:45 am
Location: Russia, Moscow
Contact:

Post by Vladimir Grigoriev »

The maximum number of characters in a full path, including the drive letter, colon, leading backslash, file name, and terminating null character, is 260.
Post Reply