長いファイル名を変更する

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\長いファイル名" "短いファイル名"

のように変更する。
MSDNMoveFileのドキュメントによると、長いパス名を扱うには先頭に「\\?\」のようなプレフィックスを付ける必要があるらしい。初めて知った。

このプレフィックスさえつければ普通に変更できるのかな? と思って ren コマンドの引数や、JScriptの MoveFile とかで試してみたけどダメだった。手軽な方法が無くて残念。