Project

General

Profile

Bug #12551

Exception accessing file with long path on windows

Added by Maturin (Lars Benner) almost 3 years ago. Updated about 1 year ago.

Status:
Assigned
Priority:
Normal
Target version:
-
ruby -v:
ruby 2.3.0p0 (2015-12-25 revision 53290) [x64-mingw32]
[ruby-core:76256]

Description

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 '
from repro_lstat_exception.rb:13:in chdir'
from repro_lstat_exception.rb:13:in
'

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) long_file_name_error.zip Maturin (Lars Benner), 07/04/2016 03:00 PM

Related issues

Has duplicate Ruby trunk - Bug #14631: Add support for long paths in Windows 10 when support is enabled in the OSOpenActions

History

Updated by headius (Charles Nutter) over 2 years ago

FYI, the JRuby issue is waiting on a decision from MRI about how to handle this.

Updated by shyouhei (Shyouhei Urabe) over 2 years ago

  • Status changed from Open to Assigned

Updated by usa (Usaku NAKAMURA) over 2 years ago

Sorry for late reply.

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.

#4

Updated by nobu (Nobuyoshi Nakada) about 1 year ago

  • Has duplicate Bug #14631: Add support for long paths in Windows 10 when support is enabled in the OS added

Updated by preetpalS (Preetpal Sohal) about 1 year ago

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. Also note that the MAX_PATH limitation was removed from common Win32 file and directory functions starting with Windows 10, Version 1607 (reference: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath).

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)))

Updated by shevegen (Robert A. Heiler) about 1 year ago

I guess if python can do it, ruby will support it as well eventually. :-)

I wish I could help more but my C knowledge is so limited compared
to my knowledge in ruby (and I use linix almost all of the time
rather than windows).

Also available in: Atom PDF