Project

General

Profile

Actions

Bug #18947

open

Unexpected Errno::ENAMETOOLONG on Windows

Added by inversion (Yura Babak) over 1 year ago. Updated 12 months ago.

Status:
Open
Assignee:
-
Target version:
-
ruby -v:
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x64-mingw-ucrt]
[ruby-core:109361]

Description

On Windows 10, I am working on a script to copy a complex folder structure.

Pathname and FileUtils work fine for me until there is a folder with a very long path (>260 chars).

Normally you cannot access such a folder with Ruby.
The next operations will raise Errno::ENOENT

Pathname.new(300_chars_path).children
FileUtils.mkpath(300_chars_path)

But there is a way in Windows to remove the MAX_PATH limitation.
You can find a small .reg file in this article:
https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry

After changing this system option, things start to work strangely in Ruby.

This will now raise Errno::ENAMETOOLONG:

Pathname.new(300_chars_path).children

But at the same time, you can create a folder with such a long path and write-read a file in it

FileUtils.mkpath(300_chars_path)
file = Pathname.new(300_chars_path+'/file.txt')
file.write 'oooooooooo'
puts Pathname.new(300_chars_path+'/file.txt').read

So you can work with individual items but attempts to list such folders' content fail (.children, .glob, .copy, etc).
In my case, deep .glob is broken for all the parent folders of that deep long-path folder ((

The only way I found for listing is

require 'win32ole'
fso = WIN32OLE.new 'Scripting.FileSystemObject'
for file in fso.GetFolder(300_chars_path).files
    file.name
    file.path.length
end

But using this workaround breaks all my code workflow built on top of Pathname and FileUtils ((.

So for me, it looks like some operations with long-path folders are not working just because in Ruby there is a check for the path length and not a real operation problem. And in some places (see .mkpath) there is no such check and all works fine.

Also notice that other applications on Windows have no problems with long-path folders (like Total Commander).

Please consider reviewing if we really need to raise Errno::ENAMETOOLONG if the LongPathsEnabled option is enabled in the Windows registry.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0