ツインテールの吸血鬼はお好きですか

Do you like a twintail vampire ?

robocopyにおけるショート・ロングファイル名の取り扱いについて

DOSの亡霊か!…と叫びたくなるような事態に遭遇したのでメモ。


コピーって一見すごく簡単な操作だと思うけど、わりと考えなくちゃいけないことが多い。…ってことが最近わかってきた。そのひとつがファイル名。ファイル名ってのは案外くせ者で、ファイルコピーの際に気にしなくちゃいけないことのひとつだったりする。


おれが遭遇したのはこんな事例。


1.WindowsからSambaの共有フォルダをマウントする。
2.Sambaの共有フォルダのsrcフォルダからWindowsのローカルフォルダdstにrobocopyでミラーリングをする。
3.コピー先のWindowsでファイルが正常にコピーされてない!


事例。

コピー元。Mac上に共有を切ってWindowsからZドライブとしてマウント。


ここからコマンドプロンプトで以下のコマンドを打つ。

C:\>robocopy /mir z:\src f:\dst

これはコピー元とコピー先を同じ状態(ミラーリング)するってコマンド。ファイル同期の常套手段らしい。

コピー先。Windows 7のローカルドライブ上のフォルダ。
ファイルがひとつコピーできてない…。なして?

…理由はWindowsにはDOS時代から引きずってるファイル名の形式によるものっぽい。いわゆる8.3形式のショートファイル名ってやつだ。
このショートファイル名はWindowsではすべてのファイルに自動的に作成されるのがデフォルト。それが悪さをしてこんな状態になってしまう。

動作としてはこんな感じ。
1.コピー元からコピー先に「テスト ファイル.txt」がコピーされる。と同時にショートファイル名「テスト~1.TXT」も作成される。
2.コピー元から「テスト~1.txt」がコピーされる。このときコピー先に既に「テスト~1.TXT」があるため「上書き」される。
3.ロングファイル名は元のまま残るが、中身は「テスト~1.txt」になる。
4.robocopyの結果は正常である。←これが重要



ログからわかんね、ってのが非常に辛い。ファイル名の精査すればわかるんだけれどさ。


以下、コマンド実行の様子。

z:\src>dir /x
 ドライブ Z のボリューム ラベルは ming です
 ボリューム シリアル番号は XXX-XXX です

 z:\src のディレクトリ

2011/01/17  01:06    <DIR>                       .
2011/01/17  01:06    <DIR>                       ..
2011/01/17  01:09                 6              テスト ファイル.txt
2011/01/17  01:09                 8              テスト~1.txt
               2 個のファイル                  14 バイト
               2 個のディレクトリ  215,293,206,528 バイトの空き領域

z:\src>type "テスト ファイル.txt"
ロング
z:\src>type "テスト~1.txt"   txt"
ショート
z:\src>f:

F:\>robocopy /mir z:\src f:\dst

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー

-------------------------------------------------------------------------------

  開始: Mon Jan 17 01:12:29 2011

   コピー元 : z:\src\
     コピー先 : f:\dst\

    ファイル: *.*

  オプション: *.* /S /E /COPY:DAT /PURGE /MIR /R:1000000 /W:30

------------------------------------------------------------------------------

                           2    z:\src\
100%        新しいファイル                     6        テスト ファイル.txt
100%        新しいファイル                     8        テスト~1.txt

------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗
Extras
   ディレクトリ:         1         0         1         0         0         0
     ファイル:         2         2         0         0         0         0
      バイト:        14        14         0         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00


       速度:                  71 バイト/秒
       速度:               0.004 MB/分

       終了: Mon Jan 17 01:12:29 2011

F:\>dir /x dst
 ドライブ F のボリューム ラベルは ボリューム です
 ボリューム シリアル番号は YYY-YYY です

 F:\dst のディレクトリ

2011/01/17  01:12    <DIR>                       .
2011/01/17  01:12    <DIR>                       ..
2011/01/17  01:09                 8 テスト~1.TXT テスト ファイル.txt
               1 個のファイル                   8 バイト
               2 個のディレクトリ  12,127,363,072 バイトの空き領域

F:\>type "dst\テスト ファイル.txt"
ショート


正直こんなのレアケースだと思うだろう?…でも世の中広いもんだ。古いDOS時代のシステムが動いていて、それがUNIXの共有フォルダにファイルを出力していて…たまたまそこにロングファイル名のファイルもあって…。いや、ハマったわ。


参考
http://support.microsoft.com/kb/195144/ja