Windowsでファイル名に使用できない文字(列)
Win32(※1)ではファイル名に使用できない文字(列)というものが決まっています。これはDOS時代からの互換性のためによるものです。Naming a File(msdn2 library)から引用。ここではDOSからの仕様に基づいて書かれているようです。
- AUX、CLOCK$、COM1 ~ COM9、CON、CONFIG$、LPT1 ~ LPT9、NUL、および PRN(※2)
- \ < > : " / \ | ? *(※3)
- period(.)はカレントディレクトリを表すので不可。
- ASCIIの0から31までは使用不可。128-255までは使用してもよい。
- 二つのperiod(..)は「一つ上のフォルダ」を表すので不可。
- 大文字小文字は区別しない(Win32の仕様)。
- ファイルの末尾をperiod(.)か空白で終わらせてはならない。
上記のうち、1のファイル名は実際作れてしまいます。aux.batとか。しかし、消すことはちょっと技を使う必要があります。サポート技術情報にいろいろ載っていますので、参考にしてください。
[KB320081]NTFSファイルシステム上のファイルまたはフォルダを削除できない
Explorerは255文字以上のファイルを扱うことができません。そういう場合、途中のフォルダを内部的にネットワーク接続してマウントしてから削除しましょうという技を知った時は感心したものです。
ファイル名の仕様は各ソフトウェアによって変わります。それぞれのシステムで確認してください。SQL Server 2005のBooks OnlineのSQLインジェクションのページにはCOM8とかLPT8とか書かれていますが、誤りでしょうね(2008/1/14現在)。
ファイル名に AUX、CLOCK$、COM1 ~ COM8、CON、CONFIG$、LPT1 ~ LPT8、NUL、および PRN を使用できる場合、これらの文字列をフィールドで受け入れない。
Team Foundation ServerもDOSの予約名に加え、本来ファイル名として使用できる文字のほかに使用できない文字があるとしています。
使用できるファイル名はCreateFileがもっとも詳しいはずなので、まずはこちらで確認しましょう。
※1:Win32と断りを入れているのはNTFS上は作れるため。POSIXシステム(Service for Unix,今はUNIX互換プログラム)上はOK。
※2:ところでこのCOM9とかLPT9って、見るところによっては10までNGって書いているんですよね。おそらくCreateFileの仕様により、"COM10"は\\.\COM10とアクセスしなくてはならないからなのでしょう。
※3:実際:は別の用途で使用することができます。またあとで。