パスやファイル名では、一部の制御文字・記号を使うことができません。 パスとして使用できない文字はGetInvalidPathCharsメソッド、ファイル名として使用できない文字はGetInvalidFileNameCharsメソッドによって、char/Charの配列として取得できます。 このメソッドでは、現在の実行環境において使用できない文字を返します。 GetInvalidFileNameCharsメソッドの返す結果には、ディレクトリ区切り文字は含まれません。

Path.GetInvalidPathChars/GetInvalidFileNameCharsメソッドでパス/ファイル名に使えない文字の一覧を取得する
Imports System
Imports System.IO
Imports System.Linq
Imports System.Text.Unicode

Class Sample
  Shared Sub Main()
    ' ファイル名に使えない文字を取得・表示する
    Console.WriteLine(
      "InvalidPathChars: {0}",
      String.Join(" ", Path.GetInvalidFileNameChars().Select(AddressOf ToUnicodeControlPictures))
    )

    ' パスに使えない文字を取得・表示する
    Console.WriteLine(
      "InvalidFileNameChars: {0}",
      String.Join(" ", Path.GetInvalidPathChars().Select(AddressOf ToUnicodeControlPictures))
    )
  End Sub

  Shared Function ToUnicodeControlPictures(ByVal c As Char) As Char
    Return If(Char.IsControl(c), ChrW(UnicodeRanges.ControlPictures.FirstCodePoint + AscW(c)), c) ' Control CodesをControl Picturesに変換する
  End Function
End Class
実行結果
InvalidPathChars: " < > | ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟ : * ? \ /
InvalidFileNameChars: | ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏ ␐ ␑ ␒ ␓ ␔ ␕ ␖ ␗ ␘ ␙ ␚ ␛ ␜ ␝ ␞ ␟
上記の結果を16進表記にしたもの
InvalidPathChars: 22 3C 3E 7C 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 3A 2A 3F 5C 2F
InvalidFileNameChars: 7C 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
実行結果
InvalidPathChars: ␀ /
InvalidFileNameChars: ␀
上記の結果を16進表記にしたもの
InvalidPathChars: 00 2F
InvalidFileNameChars: 00

このメソッドが返す配列を用いることにより、例えばユーザーによって入力されたパスやファイル名などのバリデーション(妥当性の検証)を行うことができます。 なお、Pathクラスのメソッドは、パスに使用できない文字が含まれる場合に例外ArgumentExceptionをスローするものがあります。

一方で、Pathクラスにはパス・ファイル名に使用できない文字を別の文字に置き換えるようなメソッドは存在しません。 そのため、パス・ファイル名がユーザー入力などによって与えられるケースでは、何らかのルールを定義して妥当でない文字を別の文字に置換するなどしてからファイル操作を行う必要があります。

シェルや文字コードの種類・組み合わせによってはこれ以外の文字が特殊記号と誤認され、パス・ファイル名を原因とする意図しない動作となる場合があります。 この点についてはダメ文字を含むかどうかチェックするを参照してください。

GetRandomFileNameメソッドGetTempFileNameメソッドを用いることで、妥当かつランダムなファイル名を生成することができます。 使用不可能な文字を含まない適当なファイル名が必要な場合には、これらのメソッドを用いることもできます。