Issue #12551 has been updated by preetpalS (Preetpal Sohal).


usa (Usaku NAKAMURA) wrote:
> It's too difficult to get rid of the limitation of `MAX_PATH`,
> because many OS API and system functions in C runtime depend on it.
> 
> OS API can handle long path with `\\?\` prefix, but when using this prefix,
> the rest must be an absolute path.
> Ruby cannot guarantee that a path passed by a user is an absolute path,
> so we cannot use this trick at all times.

Python 3.6.2 (64 bits) is able to handle really long paths even when supplied relative paths. I'm not sure how Python is able to do this but its approach might be relevant to solving this issue.

~~~ python
import os

i = 1
pathToCreate = "python_long_relative_path_stress_test\\" + str(i)
while i < 1000:
  try:
    i = i + 1
    pathToCreate = pathToCreate + "\\" + str(i)
    os.makedirs(pathToCreate)
  except:
    print("Failed to create folder:")
    print(len(os.path.abspath(pathToCreate)))
    exit(1)

print("Could create path of size (using relative paths):")
print(len(os.path.abspath(pathToCreate)))
~~~


----------------------------------------
Bug #12551: Exception accessing file with long path on windows
https://bugs.ruby-lang.org/issues/12551#change-71220

* Author: Maturin (Lars Benner)
* Status: Assigned
* Priority: Normal
* Assignee: usa (Usaku NAKAMURA)
* Target version: 
* ruby -v: ruby 2.3.0p0 (2015-12-25 revision 53290) [x64-mingw32]
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
Accessing file with a long file name causes this exception:

C:/Projects/Head/Build/cm/testdir01/testdir02/testdir03/testdir04/testdir05/testdir06/testdir07/testdir08/testdir09/testdir10/testdir11/testdir12/testdir13/testdir14/testdir15/testdir16/testdir17/testdir18/testdir19/testdir20/testdir21/testdir22/longtestfile.name.txt
repro_lstat_exception.rb:42:in `stat': No such file or directory @ rb_file_s_stat - C:/Projects/Head/Build/cm/testdir01/testdir02/testdir03/testdir04/testdir05/testdir06/testdir07/testdir08/testdir09/testdir10/testdir11/testdir12/testdir13/testdir14/testdir15/testdir16/testdir17/testdir18/testdir19/testdir20/testdir21/testdir22/longtestfile.name.txt (Errno::ENOENT)
        from repro_lstat_exception.rb:42:in `block in <main>'
        from repro_lstat_exception.rb:13:in `chdir'
        from repro_lstat_exception.rb:13:in `<main>'

Can be reproduced with the attach script.

I used windows 7 64 bit and an NTFS file system. 

For me it looks like, it has something to do with the legacy MAX_PATH_LENGTH of 260 characters. See https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath for more information. 

Originally I discovered the bug with JRuby (https://github.com/jruby/jruby/issues/3995).

With older Ruby version, I tried 1.8.5, it is working.



---Files--------------------------------
long_file_name_error.zip (10.7 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>