長いファイル名を変更する
Windowsでは、パス文字列の長さが260文字を超えてしまうと、Explorerだろうがコマンドプロンプトだろうが「ファイル名または拡張子が長すぎます。」と言われて移動や削除ができなくなってしまうらしい(Vistaでも直ってない)。これの対処方法。
親フォルダの名前を短くする
Microsoftのページ にある解決方法。でも、そもそも C:\a\b\c\d\e\f\g\長いファイル名 のように切り詰められない場合は?
SUBSTコマンドを使う
フォルダに対してドライブ文字を割り当てるSUBSTコマンドを使って、極限まで短くする。たとえば上のような場合なら、コマンドプロンプトから
subst X: C:\a\b\c\d\e\f\g
とすると C:\a\b\c\d\e\f\g フォルダに X:\ でアクセスできるようになるので、エクスプローラでXドライブからアクセスしたり、コマンドプロンプトから
X: ren 長いファイル名 短いファイル名
のようにすればファイル名を短く変更できる。(パス全体ではなく)ファイル名自体はどうやっても255文字くらいまでしか付けられないので、この方法で必ず対処できるはず。
Win32 APIを直接叩く
今はC#を使用中なのでC#で無理矢理やってみる。
たとえば、Visual Studio C# の Express 版をダウンロードして以下のようなコンソールプログラムを作成する。
using System; using System.Runtime.InteropServices; namespace MoveFile { class Program { [DllImport("kernel32.dll", EntryPoint="MoveFileW", CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)] private extern static bool MoveFile(String from, String to); static void Main(string[] args) { MoveFile(args[0], args[1]); } } }
これをビルドしてできる MoveFile.exe を使って
> MoveFile.exe "\\?\C:\a\b\c\d\e\f\g\長いファイル名" "短いファイル名"
のように変更する。
MSDNのMoveFileのドキュメントによると、長いパス名を扱うには先頭に「\\?\」のようなプレフィックスを付ける必要があるらしい。初めて知った。
このプレフィックスさえつければ普通に変更できるのかな? と思って ren コマンドの引数や、JScriptの MoveFile とかで試してみたけどダメだった。手軽な方法が無くて残念。