2016年3月16日水曜日

aux.cが削除できない

とあるLinuxカーネルのソースをWindows7上で展開して眺め、
用が済んだのでディレクトリ丸ごと消そうとするも消えない。
ただ1つのファイルが消せないことが原因です。
パーミッションが原因で以前にも似たようなことがあったので
備忘録を頼りにいろいろやってみるもだめ。
呪いだと思って諦めることにしました。

いくらか時間が経った後、同じようにLinuxカーネルのソースを削除すると
やっぱり削除できない。
そして残ったのは同じファイルです。
その名も"aux.c"、ってもしかして…

Windowsでは特定の名前をファイルやフォルダにつけることはできません。
DOSの名残りなんでしょうが、その名前は予約語と呼ばれ、有名なのは"com1"です。
実は"aux"も予約語で私はそれを知りませんでした。
しかも予約語に何らかの拡張子が付いていても予約語として扱われる
ということも知りませんでした。

ちなみに改めて予約語を調べてみると、
MSDNのサイトで見つかりました。
CON,PRN,AUX,NUL,COMx,LPTx
だそうです。ここでxは1桁の整数で、大文字小文字の区別はありません。
本来この手のファイルは作成すらできなくなっているのですが、
圧縮ファイルの展開等で作られてしまうことはあるんですね。
'.'(ドット)で始まるファイルやフォルダと同様ですね。

ところで'.'(ドット)で始まるものは通常の方法で削除できるのに、
予約語のファイル名は消すには面倒な作業が必要です。
[エクスプローラ]で消せないファイルが存在するフォルダ(中身ではない)を表示し、
そのフォルダを[Shift]を押しながら右クリックしてコンテキストメニューを開いて
[コマンドウィンドウをここで開く]を選択します。
開いたコマンドウィンドウのプロンプトの'>'の左側の文字列をコピーします。
これは<フォルダのフルパス>です。
で、コマンドウィンドウで
del ¥¥.¥<フォルダのフルパス>¥<予約語のファイル名>
以下を実行します。
これで呪いのファイルが消えているはずです。

しかしWindowsのファイルシステムって制限きついですよね。
今まで出会って本当に参ったのは大文字小文字問題です。
Linuxでは"ABC","abc","Abc"は別々のファイルとして扱われるのですが、
Windowsでは全部同じファイルなんですよね。
NTFSはファイル名としては大文字小文字を区別して保存しますが、
管理では一緒くたにされてしまうので、
"ABC"の存在するフォルダに"abc"をコピーしようとすると
"ABC"への上書きとなってしまいます。
まあLinuxカーネルのソースでこれにぶち当たって、
LinuxからsvnサーバにコミットしたもののWindowsでは
チェックアウトできないという悲惨なことになったのは大昔のこと。
最近はケアされているのかそんなことはありません。
でも今後もWindowsが抱える爆弾でありつづけるんでしょう。

0 件のコメント:

コメントを投稿