[#109207] [Ruby master Feature#18915] New error class: NotImplementedYetError or scope change for NotImplementedYet — Quintasan <noreply@...>
Issue #18915 has been reported by Quintasan (Michał Zając).
18 messages
2022/07/14
[ruby-core:109361] [Ruby master Bug#18947] Unexpected Errno::ENAMETOOLONG on Windows
From:
"inversion (Yura Babak)" <noreply@...>
Date:
2022-07-29 07:08:19 UTC
List:
ruby-core #109361
Issue #18947 has been reported by inversion (Yura Babak).
----------------------------------------
Bug #18947: Unexpected Errno::ENAMETOOLONG on Windows
https://bugs.ruby-lang.org/issues/18947
* Author: inversion (Yura Babak)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x64-mingw-ucrt]
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
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`
``` ruby
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`:
``` ruby
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
``` ruby
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
``` ruby
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.
--
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>