岩崎です。

こんにちは、なかむら(う)さん。

>| 当初のコードは以下のようなもので、Dir.chdir(dir)は通って、
>| Dir.pwdのことろでNoMemoryErrorエラーとでました。
>
>何度やっても同じところでNoMemoryErrorでしょうか?

同じフォルダーでテストする場合は同じです。
長さを変えたりしてテストはしておりません。

>| 元々WindowsではMAX_PATHの話があるような気がしますが、
>| Explorerで256以上になるフォルダーを作成しても問題がありません。
>| 
>| Rubyで扱えないのは仕様でしょうか?
>
>パス名の長さに関しては、いちおう仕様ということで。
>頑張れば32000文字くらいにできるらしいんですが(NT系の場合)、今
>のところそこで頑張る予定は特にないです。

それは残念です。

普通はそんなに長い名前をつけないのでしょうが、
サーバを利用するユーザがネットワークドライブの割り当てなどを
利用した結果 長い名前になってしまうことはあり得る話です。

都度気にしないといけないのは辛いところですが、プログラム側で
ネットワークドライブの割り当てを併用して対処します。

バグっぽいところは宜しくお願いします。

私の場合は以下の例で
dirが162bytes
dir2が275bytesで
NoMemoryErrorがでました。

宜しくお願いします。

========================================================
#!/usr/bin/ruby -Ks

def xtree(dir,lev=0,&y)
  Dir.chdir(dir) do |dir|
    # 自分のサブフォルダーを調べる
    subdirs=[]
    Dir.glob('*').each do |file|
      subdirs.push(file) if FileTest.directory?(file) 
    end
    
    pwd=Dir.pwd
    puts ":pwd:#{pwd}"
    
    yield pwd if lev !=0
    
    subdirs.each_with_index do |d,i|
      xtree(d,lev+1,&y)
    end
  end
end

dir='\\\\xxxxxxxx\yyyy....' #適当な長さにしてください。
dir2=dir+'\\'+'zzzz....'       #256以上になる長さのフォルダーを事前に用意してください。

xtree(dir) do |path,lev,cnt,subcnt,head|
  puts "path=#{path}"
end