2016/09/14

.NET Framework 4.6.2 でPathTooLongExceptionが回避できるのか?

.NET Framework 4.6.2で、MAX_PATH(260)の制限が取り払われたよ~!
というニュースをあちこちで見て、『ほぅ~、どれどれ』と、プログラムを書いてみるものの、全然思い通りにならない。
マジでMAX_PATH越えを実装しているのか?!
と、途方に暮れて数週間。
こんなサイト(開発関係者のブログ?)を発見。

.NET 4.6.2 and long paths on Windows 10

英語の苦手な、ネイティブ・ドイツ人の私には、なかなかよく分からないのだが、どうやら、
  • Windows 10 Anniversary Update以降のOSのみに対応
  • ローカル・グループ・ポリシーで、Enable Win32 long pathをOnにしなければならない
  • .NETアプリの設定ファイルApp.configにLongPath動作を有効にする設定が必要
という条件が揃わないと駄目らしい。使えねぇ~!

一応、同じような事で困っているかもしれない人のために、詳細情報を。

Windows 10 Anniversary Update以降のOSのみに対応

Windows 8は、.NET Framework 4.6.2は対象外としても、Windows 8.1やWindows 7はまだ現役でバリバリ使われているOSなのに。
実は、ちゃんと裏を取っていません。「いや、Windows 7で動くぜっ!」とか反論がある人は、コメントをよろしくお願いします。
m(_ _)m

ローカル・グループ・ポリシーで、Enable Win32 long pathをOnにしなければならない

 デフォルトでOffになっているって事は、既存のアプリがMAX_PATHを前提に作られているから、互換性のために無効になっているのだと思われます。
Windows 10 Homeでは、グループ・ポリシー・エディタって無いじゃん?と思ったら、先に紹介したサイトでも同じようなコメントが付いていて、レジストリエディタで値をいじると良いよ、的アドバイスがあります。
おそらく、OSの再起動が必要じゃないかと思います。
この件も、試行錯誤の上、そうしないと動かなかったって事なんですけど、「Windows 10 Anniversary Updateじゃないけど、動くぜ!」と反論のある方はコメントにてお願いします。

.NETアプリの設定ファイルApp.configにLongPath動作を有効にする設定が必要

これも、紹介したサイトに情報がありますけど、こんな感じになるはずです。



後、以降錯誤をして気が付いたのですが、System.IO.Directory.CreateDirectoryで作れるディレクトリ名の長さは、やはり制限があって、一つにつき246文字とMAX_PATHよりもさらに小さい長さでしか作れない。もちろん、200文字ずつ3つのフォルダを組み合わせてだったら、合計文字列としてMAX_PATH越えはOKのようです。
 MAX_PATH越えの確認をするプログラムで、まずはディレクトリから作ろうと普通は考えるので、この見えない制限で結構ハマるんじゃないかな?私だけか?

それにしても、今回の件もなのですが、日本語の情報って少ない。
というか、開発者のブログではなく、Microsoftの.NET Frameworkのサイトの情報に、ちゃんと書いてよ!
紹介サイトの人のブログのコメント欄でしか情報が分からないって、おかしいじゃん!
フリーソフトじゃないんだから。天下のMicrosoftのミドルウェアソフトなんでしょ?!
とか、思いました。
そして、品質はともかく、AlphaFSの方が良く無くない?とか思いました。