[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

No such file or directory - bug due to filepath length?

fensterblick

1/22/2008 7:02:00 PM

Hello again from another relative newcomer. I am encountering a weird
issue when trying to write out a file to disk. I get a "No such file
or directory" error if the file path is greater than or equal to 194
characters. I have no problem with lengths less than 194 characters. I
am using Ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32].

Here is a very simplified version of my code that causes the issue:

backup_dir = "backup\\deployer\\172.00.00.00\\opt\\jboss\\server\default\\deploy\\birtdaemon.war\\WEB-INF\\plugins\org.eclipse.birt.report.data.oda.jdbc_2.1.1.v20070205-1728\\drivers\"
FileUtils.mkdir_p (backup_dir)
this_location_works = backup_dir + "abcdefghijklmnopqrst"
this_location_fails = backup_dir + "abcdefghijklmnopqrstu"
File.open( this_location_works, "wb" ) { |f| f.write "hello hello
hello..." }
File.open( this_location_fails, "wb" ) { |f| f.write "can't figure
out why this won't work!" }


As you can see, I am able to create one file but not the other. Is
this a bug or is there an error with my code? I searched through the
newgroup but I can't find any previous problems related to filepath
lengths.

Thanks for any help - I have to demo a script this week and I came
across this issue during testing. On a less urgent matter, I tried to
debug this code using ruby-debug, but I can't step into File.open().
How does one step through File.open()? My guess is that I cannot step
into it because it might not be written in Ruby (perhaps C?). If it is
written in C, where can I find the source code for it? Again, I'm a
newbie to Ruby so don't feel bad about including seemingly obvious
details in an answer.
3 Answers

Alex LeDonne

1/22/2008 7:17:00 PM

0

On Jan 22, 2008 2:05 PM, <fensterblick@gmail.com> wrote:
> Hello again from another relative newcomer. I am encountering a weird
> issue when trying to write out a file to disk. I get a "No such file
> or directory" error if the file path is greater than or equal to 194
> characters. I have no problem with lengths less than 194 characters. I
> am using Ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32].
>
> Here is a very simplified version of my code that causes the issue:
>
> backup_dir = "backup\\deployer\\172.00.00.00\\opt\\jboss\\server> \default\\deploy\\birtdaemon.war\\WEB-INF\\plugins> \org.eclipse.birt.report.data.oda.jdbc_2.1.1.v20070205-1728\\drivers> \"

Well, that's a relative path. I'll bet if you look at the FULL path,
you'll discover that the full path for the working example below is
255 characters, and the second is 256. What is the FULL path of
backup_dir?

-A


> FileUtils.mkdir_p (backup_dir)
> this_location_works = backup_dir + "abcdefghijklmnopqrst"
> this_location_fails = backup_dir + "abcdefghijklmnopqrstu"
> File.open( this_location_works, "wb" ) { |f| f.write "hello hello
> hello..." }
> File.open( this_location_fails, "wb" ) { |f| f.write "can't figure
> out why this won't work!" }
>
>
> As you can see, I am able to create one file but not the other. Is
> this a bug or is there an error with my code? I searched through the
> newgroup but I can't find any previous problems related to filepath
> lengths.
>
> Thanks for any help - I have to demo a script this week and I came
> across this issue during testing. On a less urgent matter, I tried to
> debug this code using ruby-debug, but I can't step into File.open().
> How does one step through File.open()? My guess is that I cannot step
> into it because it might not be written in Ruby (perhaps C?). If it is
> written in C, where can I find the source code for it? Again, I'm a
> newbie to Ruby so don't feel bad about including seemingly obvious
> details in an answer.
>
>

fensterblick

1/22/2008 7:37:00 PM

0

> What is the FULL path of backup_dir?
>

The full path is:
C:\Documents and Settings\fensterb001\Desktop\projects
\eclipse_workspace\pwdmgr\backup\deployer\172.16.11.33\opt\jboss\server
\default\deploy\birtdaemon.war\WEB-INF\plugins
\org.eclipse.birt.report.data.oda.jdbc_2.1.1.v20070205-1728\drivers
That is 239 characters. "abcdefghijklmnopqrst" is 20 characters long,
resulting in 259 total characters for the successfully created file.

If there is a 256 character limit, where is this limit referenced? I
can't seem to find any references to it in the Core Reference. In
Windows, we can easily create files with filepaths greater than 256
characters; I would also expect this case to be handled successfully
by File.open().

(Sidenote: I did move the backup directory to C:\backup, and that
worked around the issue)

Alex LeDonne

1/22/2008 8:00:00 PM

0

On Jan 22, 2008 2:39 PM, <fensterblick@gmail.com> wrote:
> > What is the FULL path of backup_dir?
> >
>
> The full path is:
> C:\Documents and Settings\fensterb001\Desktop\projects
> \eclipse_workspace\pwdmgr\backup\deployer\172.16.11.33\opt\jboss\server
> \default\deploy\birtdaemon.war\WEB-INF\plugins
> \org.eclipse.birt.report.data.oda.jdbc_2.1.1.v20070205-1728\drivers>
> That is 239 characters. "abcdefghijklmnopqrst" is 20 characters long,
> resulting in 259 total characters for the successfully created file.
>
> If there is a 256 character limit, where is this limit referenced? I
> can't seem to find any references to it in the Core Reference. In
> Windows, we can easily create files with filepaths greater than 256
> characters; I would also expect this case to be handled successfully
> by File.open().
>
> (Sidenote: I did move the backup directory to C:\backup, and that
> worked around the issue)

Well, I don't think the 'C:\' counts in the path length, as it's the
drive root. So I do belive this is a 256-character limit issue.

Yup... found it:

"Maximum Path Length

"In the Windows API, the maximum length for a path is MAX_PATH, which
is defined as 260 characters. A path is structured in the following
order: drive letter, colon, backslash, components separated by
backslashes, and a null-terminating character, for example, the
maximum path on the D drive is "D:\<256 chars>NUL". "

http://msdn2.microsoft.com/en-us/library/aa3...


That page also provides a possible workaround:

"The Unicode versions of several functions permit a maximum path
length of approximately 32,000 characters composed of components up to
255 characters in length. To specify that kind of path, use the "\\?\"
prefix.

" Note The maximum path of 32,000 characters is approximate,
because the "\\?\" prefix can be expanded to a longer string, and the
expansion applies to the total length.

"For example, "\\?\D:\<path>". To specify such a UNC path, use the
"\\?\UNC\" prefix. For example, "\\?\UNC\<server>\<share>". These
prefixes are not used as part of the path itself. They indicate that
the path should be passed to the system with minimal modification,
which means that you cannot use forward slashes to represent path
separators, or a period to represent the current directory. Also, you
cannot use the "\\?\" prefix with a relative path. Relative paths are
limited to MAX_PATH characters."

Good Luck!

-A