ファイル名やパスには使用できない文字があり、これらの文字を使用してファイル作成などを行うと例外「System.ArgumentException "パスに無効な文字が含まれています。"」が発生します。
ファイル名 と パス
このページでは[ファイル名]と[パス]を使い分けて解説しているので注意してください。-
パス
「ディレクトリ名」 + 「パス区切り文字」(\) + 「ファイル名」
- 例1: 「C:\test\test.txt」
- 例2: 「..\test\test.txt」
-
ファイル名
ファイル名 または フォルダ名(ディレクトリ名)
- 例1: 「test.txt」
- 例2: 「test」
ファイル名に使用できない文字
ファイル名に使用できない文字はSystem.IO.Path.GetInvalidFileNameChars、パスに使用できない文字はSystem.IO.Path.GetInvalidPathCharsで取得できます。 使用できない文字の配列を返すだけでチェックはしてくれません。ファイル作成で使用できないファイル名
次の名前はデバイスドライバ用に予約されており、使用できません。拡張子がついていても同様です。予約されている名前
COM0 | COM1 | COM2 | COM3 | COM4 | COM5 | COM6 | COM7 | COM8 | COM9 |
LPT0 | LPT1 | LPT2 | LPT3 | LPT4 | LPT5 | LPT6 | LPT7 | LPT8 | LPT9 |
CON | PRN | AUX | NUL | CLOCK$ |
使用できない名前 + 拡張子の組み合わせもNGです。
NG例
- COM0.txt
- COM0.jpg
サンプルコード
文字列を渡すとパス(ファイル名)として正しいかチェックをする関数と、その使い方です。-
C#
public class FileUtil { /// <summary> /// パスが正しいかチェックする /// </summary> /// <param name="path">ファイルパス</param> /// <param name="isFileName">ファイル名の場合true, パスの場合false</param> /// <returns>True:正しいパス</returns> public static bool IsSafePath(string path, bool isFileName) { if (string.IsNullOrEmpty(path)) { // null か、空文字列は不正とする return false; } // 使えない文字があるかチェック char[] invalidChars; if (isFileName) { invalidChars = System.IO.Path.GetInvalidFileNameChars(); } else { invalidChars = System.IO.Path.GetInvalidPathChars(); } if (path.IndexOfAny(invalidChars) >= 0) { // 使えない文字がある return false; } // 使えないファイル名を含んでいないかチェック if (System.Text.RegularExpressions.Regex.IsMatch(path , @"(^|\\|/)(CON|PRN|AUX|NUL|CLOCK\$|COM[0-9]|LPT[0-9])(\.|\\|/|$)" , System.Text.RegularExpressions.RegexOptions.IgnoreCase)) { // 使えないファイル名がある return false; } return true; } }
使用例
if (FileUtil.IsSafePath(@".\nul", true)) { MessageBox.Show("正しいファイル名です。"); } else { MessageBox.Show("不正なファイル名です。"); }
-
VB.NET
Public Class FileUtil ''' <summary> ''' パスが正しいかチェックする ''' </summary> ''' <param name="path">ファイルパス</param> ''' <param name="isFileName">ファイル名の場合true, パスの場合false</param> ''' <returns>True:正しいパス</returns> Public Shared Function IsSafePath(ByVal path As String, ByVal isFileName As Boolean) As Boolean If (String.IsNullOrEmpty(path)) Then ' null か、空文字列は不正とする Return False End If ' 使えない文字があるかチェック Dim invalidChars As Char() If (isFileName) Then invalidChars = System.IO.Path.GetInvalidFileNameChars() Else invalidChars = System.IO.Path.GetInvalidPathChars() End If If (path.IndexOfAny(invalidChars) >= 0) Then ' 使えない文字がある Return False End If ' 使えないファイル名を含んでいないかチェック If System.Text.RegularExpressions.Regex.IsMatch(path _ , "(^|\\|/)(CON|PRN|AUX|NUL|CLOCK\$|COM[0-9]|LPT[0-9])(\.|\\|/|$)" _ , System.Text.RegularExpressions.RegexOptions.IgnoreCase) Then ' 使えないファイル名がある Return False End If Return True End Function End Class
使用例
If FileUtil.IsSafePath(".\nul", True) Then MessageBox.Show("正しいファイル名です。") Else MessageBox.Show("不正なファイル名です。") End If
資料 Windowsでファイル名とパスに使用できない文字
ファイル名 | パス | 文字コード(16進) | 文字コード(10進) | コード | 英名 | 意味 |
---|---|---|---|---|---|---|
✕ | ✕ | 0x22 | 034 | " | ||
✕ | ✕ | 0x3c | 060 | < | ||
✕ | ✕ | 0x3e | 062 | > | ||
✕ | ✕ | 0x7c | 124 | | | ||
✕ | ✕ | 0x00 | 000 | NUL | Null | 空文字 / 終端 |
✕ | ✕ | 0x01 | 001 | SOH | Start Of Heading | ヘッダ開始 |
✕ | ✕ | 0x02 | 002 | STX | Start Of Text | テキスト開始 |
✕ | ✕ | 0x03 | 003 | ETX | End Of Text | テキスト終了 |
✕ | ✕ | 0x04 | 004 | EOT | End Of Transmission | 伝送終了 |
✕ | ✕ | 0x05 | 005 | ENQ | Enquery | 問い合わせ |
✕ | ✕ | 0x06 | 006 | ACK | Acknowledgement | 肯定応答 |
✕ | ✕ | 0x07 | 007 | \a(BEL) | Bell | 警告音を鳴らす |
✕ | ✕ | 0x08 | 008 | \b(BS) | Back Space | 一文字後退 |
✕ | ✕ | 0x09 | 009 | \t(HT) | Horizontal Tabulation | 水平タブ |
✕ | ✕ | 0x0a | 010 | \n(LF/NL) | Line Feed / New Line | 改行 |
✕ | ✕ | 0x0b | 011 | \v(VT) | Vertical Tabulation | 垂直タブ |
✕ | ✕ | 0x0c | 012 | \f(FF/NP) | Form Feed / New Page | 改ページ |
✕ | ✕ | 0x0d | 013 | \r(CR) | Carriage Return | 行頭復帰 |
✕ | ✕ | 0x0e | 014 | SO | Shift Out | シフトアウト(多バイト文字終了) |
✕ | ✕ | 0x0f | 015 | SI | Shift In | シフトイン(多バイト文字開始) |
✕ | ✕ | 0x10 | 016 | DLE | Data Link Escape | データリンク拡張(バイナリ通信開始) |
✕ | ✕ | 0x11 | 017 | DC1 | Device Control 1 | 装置制御1 |
✕ | ✕ | 0x12 | 018 | DC2 | Device Control 2 | 装置制御2 |
✕ | ✕ | 0x13 | 019 | DC3 | Device Control 3 | 装置制御3 |
✕ | ✕ | 0x14 | 020 | DC4 | Device Control 4 | 装置制御4 |
✕ | ✕ | 0x15 | 021 | NAK | Negative Acknowledgement | 否定応答 |
✕ | ✕ | 0x16 | 022 | SYN | Synchronous idle | 同期 |
✕ | ✕ | 0x17 | 023 | ETB | End of Transmission Block | 伝送ブロック終了 |
✕ | ✕ | 0x18 | 024 | CAN | Cancel | 取り消し |
✕ | ✕ | 0x19 | 025 | EM | End of Medium | 記録媒体終端 |
✕ | ✕ | 0x1a | 026 | SUB/EOF | Substitute / End Of File | 文字置換 / ファイル終端 |
✕ | ✕ | 0x1b | 027 | ESC | Escape | エスケープ(特殊文字開始) |
✕ | ✕ | 0x1c | 028 | FS | File Separator | ファイル区切り |
✕ | ✕ | 0x1d | 029 | GS | Group Separator | グループ区切り |
✕ | ✕ | 0x1e | 030 | RS | Record Separator | レコード区切り |
✕ | ✕ | 0x1f | 031 | US | Unit Separator | ユニット区切り |
✕ | ○ | 0x3a | 058 | : | ||
✕ | ○ | 0x2a | 042 | * | ||
✕ | ○ | 0x3f | 063 | ? | ||
✕ | ○ | 0x5c | 092 | \ | ||
✕ | ○ | 0x2f | 047 | / |
サンプルコードのダウンロード
サンプルコードの実行には Microsoft Visual Studio 2008 以上のバージョンが必要です。 2008以外のバージョンではプロジェクトを開いた際にファイルの変換が必要な場合があります。その場合は変換後に実行してください。検証環境
- Microsoft Visual Studio 2008 Version 9.0.30729.4462 QFE Edition: Professional
- Microsoft .NET Framework Version 3.5 SP1
- Microsoft Windows 7 Professional Service Pack 1 (Microsoft Windows NT 6.1 (7601))