Hatena::ブログ(Diary)

Halflife

2009-01-04

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

| 18:28

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 とかで試してみたけどダメだった。手軽な方法が無くて残念。

モグモグ 2011/04/21 11:48 Halflifeさん、初めまして。このページのおかげで、この問題を解決する事ができました。ありがとうございました。
2009年2月23日から日記を更新していらっしゃらないようなので、私のこのコメントを読んで頂けるかどうか分かりませんが、
感謝の気持ちを伝えたくてコメントさせて頂きました。読んで頂けたらいいなと思います。ありがとうございました。

トラックバック - http://d.hatena.ne.jp/halflife/20090104/1231061283