パスからファイル名・ディレクトリ名を抽出したり、パスを結合したりするにはPathクラスを使います。 .NETではパスは文字列として扱うため、パス関連の文字列処理を行う専用クラスとしてPathクラスが用意されています。 Pathクラスでは、ファイル名・ディレクトリ名・拡張子といったパスからの要素の抽出、絶対パス・相対パスなどのパス同士の結合、絶対パス・相対パス間の変換やパス形式の検証などの操作を行うことができます。
URL(URI)を解析済みの状態で保持するUriクラスなどとは異なり、Pathクラスはパス自体は保持せず、パスに関する文字列操作のみを提供するクラスとなっています。 そのため、Pathクラスではインスタンスを作成せず、常にクラスメソッドを呼び出すことによりパス文字列に対する処理を行います。
Stringクラスのメソッドによる文字列操作でもパスからファイル名・ディレクトリ名の抽出、パス同士の結合といった操作を行うことはできますが、Pathクラスでは.
や..
などを含む相対パス、プラットフォームごとに異なるディレクトリ区切り文字(\
と/
)の扱い、大文字小文字の違い(file.txt
とFILE.TXT
)、ディレクトリ区切り文字終端の有無(dir\
とdir
)などを適切に扱えるようになっているため、パス操作に関するある程度の考慮をPathクラスに任せることができます。
Pathクラスでは、Windows形式(DOS)のパス、UNIX形式のパスを扱うことができるほか、Windows上ではUNCパス、DOSデバイスパスがサポートされます。 (§.Pathクラスでサポートされるパス形式)
この文書では用語としてフォルダ(folder)は用いず、Windows以外やAPI名等で共通して使われるディレクトリ(directory)を使用します。
導入
ここではPathクラスを使うにあたってよく用いられる逐語的文字列リテラルと、Pathクラスで扱えるパス形式、Pathクラスでは直接扱えないfileスキーム形式でのパスについて触れておきます。
逐語的文字列リテラルによるパスの記述
Pathクラスを含め、.NETではパスをそのままの文字列で扱います。 一方で、Windowsではパス内のディレクトリ区切り記号に\
が用いられます。 C#では文字列中で\
を用いるとエスケープ記号として扱われるため、ディレクトリ区切り文字として記述するには\\
のように二つ重ねる必要があります。
\
を多用するパスを記述する際は必然的にエスケープが多くなり読みづらくなりますが、C#では逐語的文字列リテラルを用いることで\
をエスケープせずにそのまま記述することができます。
文字列リテラル"..."
にアットマーク@
を前置して逐語的文字列リテラル@"..."
として記述すると\
はエスケープ記号としては扱われなくなり、そのまま記述できるようになります。
Pathクラスでサポートされるパス形式
Pathクラスでは、Windows形式のパス(DOSパス)、UNCパス、DOSデバイスパスなどがサポートされています。 また、ディレクトリ区切り記号として\
および/
の両方(非Windows環境では/
のみとなる)を処理できることから、UNIX形式のパスを扱うこともできます。
Windows形式・UNIX形式のパスでは相対パスを扱うことができますが、常に完全修飾されたパスとなるUNCパス・DOSデバイスパスでは相対パスを扱うことはできません。
パス形式 | パスの例 | 備考 | |
---|---|---|---|
DOSパス |
E:\dir\file.txt
|
絶対パス | 非Windows環境では、ドライブ部分もディレクトリ名(またはファイル名)の一部として解釈される |
E:/dir/file.txt
|
ディレクトリ区切り記号に/ を用いた絶対パス |
||
E:dir\file.txt
|
Eドライブのカレントディレクトリからの相対パス | ||
\dir\file.txt
|
カレントドライブからの相対パス (カレントドライブのルートディレクトリを基準とするパス) |
||
dir\file.txt
|
カレントディレクトリからの相対パス | ||
.\dir\..\file.txt
|
カレントディレクトリからの相対パス | ||
/dir/file.txt
|
ディレクトリ区切り記号に/ を用いた相対パスUNIX形式の絶対パス |
||
./dir/../file.txt
|
ディレクトリ区切り記号に/ を用いた相対パスUNIX形式の相対パス |
||
UNCパス |
\\LOCALHOST\e$\dir\file.txt
|
ローカルホストのEドライブをルートとするパス | Windows環境でのみサポートされる |
\\127.0.0.1\e$\dir\file.txt
|
ホスト127.0.0.1 のEドライブをルートとするパス |
||
\\SERVER1\Shared\dir\file.txt
|
ホストSERVER1 のボリュームShared をルートとするパス |
||
DOSデバイスパス |
\\.\E:\dir\file.txt
|
Eドライブをルートとするパス | .NET Core 1.1以降、.NET Framework 4.6.2以降かつ、Windows環境でのみサポートされる |
\\.\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\dir\file.txt
|
GUIDに一致するボリュームをルートとするパス | ||
\\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\dir\file.txt
|
GUIDに一致するボリュームをルートとするパス | ||
\\.\UNC\LOCALHOST\e$\dir\file.txt
|
ローカルホストのEドライブをルートとするパス | ||
パス形式 | パスの例 | 備考 |
file URI schemeとパス
file:
で表されるパス(file URI scheme形式のURI)はPathクラスでは直接扱うことはできません。 file:
はhttp:
などのURLと同様にUriクラスで扱います。
次の例のようにUri.HostプロパティとUri.LocalPathプロパティでURIからホスト名部とパス部を分離し、パス部をPathクラスで処理することにより、file:
形式のパスを扱うことができます。
パスの分割・要素の抽出
ここではPathクラスのメソッドを使って、パスからディレクトリ名・ファイル名や拡張子などを抽出する方法について解説します。
ファイル名・ディレクトリ名 (GetFileName/GetDirectoryName)
パスからファイル名を抽出するにはGetFileNameメソッド、ディレクトリ名を抽出するにはGetDirectoryNameメソッドを使います。
GetFileName・GetDirectoryNameメソッドでは、パスに含まれる一番最後のディレクトリ区切り文字の位置を区切りとして、ファイル名・ディレクトリ名を抽出します。 パスに該当する部分がないと判断される場合は、空の文字列が返されます。
GetFileName・GetDirectoryNameメソッドは、ファイル名・ディレクトリ名の抽出に際して、それが実際にファイルであるか、ディレクトリであるかを検証しません。 そのため、次の例のようにディレクトリ区切り文字で終わっていないパスは、仮にそれがディレクトリを表すものであってもファイル名として扱われる点に注意が必要です。 逆に言えば、ディレクトリ区切り文字で終わっていない限り、パスの最後の部分は必ずファイル名として扱われます。
パスがディレクトリ区切り文字で終端されているかどうかを調べる、あるいはパス末尾のディレクトリ区切り文字を除去するには、EndsInDirectorySeparatorメソッド・TrimEndingDirectorySeparatorメソッドを使います。
拡張子を除いたファイル名 (GetFileNameWithoutExtension)
GetFileNameメソッドでパスからファイル名を抽出できるのに対して、GetFileNameWithoutExtensionメソッドではパスから拡張子を除いたファイル名を抽出します。 例えば、パスのファイル名部分がfile.txt
の場合、GetFileNameWithoutExtensionメソッドはfileを返します。 パスから拡張子のみを抽出するには、GetExtensionメソッドを使います。
GetFileNameWithoutExtensionメソッドは、パスのファイル名部分に拡張子がなければ、ファイル名をそのまま返します。
GetFileNameWithoutExtensionメソッドでは、UNIX系OSで隠しファイルとして扱われるドットファイル(dot file)のようなピリオドで始まるファイル名に対して特別な考慮はされません。 そのため、ピリオドが一つだけ含まれるドットファイルは、ファイル名全体が拡張子と判断され、GetFileNameWithoutExtensionメソッドは空の文字列を返します。
拡張子 (GetExtension)
パスまたはファイル名から拡張子を抽出するにはGetExtensionメソッドを使います。 GetExtensionメソッドでは、パスにファイル名がない場合でも例外にはならず、単に拡張子はないものとして空の文字列が返されます。 このメソッドでは、ピリオド.
も含めて拡張子として扱われます。 (ファイル名がfile.txt
なら拡張子は.txtとなる)
ファイル名が拡張子を持たない場合、拡張子がピリオドのみの場合は空の文字列が返されます。 ピリオドが複数あるファイル名の場合は、一番最後のピリオド以降を拡張子として返します。 (ファイル名がfile.txt.bak
なら拡張子は.bakとなる)
GetExtensionメソッドでは、UNIX系OSで隠しファイルとして扱われるドットファイル(dot file)のようなピリオドで始まるファイル名に対して特別な考慮はされません。 そのため、ピリオドが一つだけ含まれるドットファイルは、ファイル名全体が拡張子と判断され、GetExtensionメソッドはファイル名をそのまま返します。
さらに非Windows環境では、ピリオドを含み、かつWindows形式のディレクトリ区切り記号\
で終わるパスは、拡張子として判断される点に注意が必要です。 例えばパスsome.dir\
はディレクトリではなくファイルを表すものと判断されるため、これに従い拡張子も.dir\
であると判断されます。 パスsome.dir/
では、ディレクトリを表すと判断されるため、これに従い拡張子はないものとして扱われます。
パスが拡張子を持つかどうか (HasExtension)
HasExtensionメソッドを使うことで、パスの表すファイル部分が、拡張子を持つかどうかを調べることができます。 HasExtensionメソッドでは、パスにファイル名がない場合でも例外にはならず、単に拡張子がないものとしてFalseが返されます。
ファイル名部分のうち、どの部分を拡張子と判断するかの基準はGetExtensionメソッドと同様です。 このため、UNIX系OSで隠しファイルとして扱われるドットファイル(dot file)は、常に拡張子を持つものとして判断されます。
拡張子の置換・削除 (ChangeExtension)
パスまたはファイル名の拡張子を別の拡張子に置き換えるにはChangeExtensionメソッドを使います。 元のパス・ファイル名に拡張子がない場合は拡張子が追加され、ピリオドが二つ以上あるファイル名の場合は一番最後のピリオド以降が置き換えられます。
ファイル名部分のうち、どの部分を拡張子と判断するかの基準はGetExtensionメソッドと同様です。 このため、UNIX系OSで隠しファイルとして扱われるドットファイル(dot file)では、ピリオドが一つだけ含まれる場合はファイル名全体が拡張子と判断され、ファイル名に対する置換が行われることになります。 この他、拡張子に関する注意点についてはGetExtensionメソッドを参照してください。
置き換える拡張子に空の文字列(String.Empty)を指定した場合、ピリオドだけの拡張子に置換されます。 一方、null
/Nothing
を指定した場合は、ピリオドも含めて拡張子が削除されます。
特に、ピリオドが一つだけ含まれるドットファイルの場合、ピリオドだけのファイル名.
、あるいは長さ0のファイル名に変換されることになるため、注意が必要です。
ファイル名の置換
拡張子を置換するChangeExtensionメソッドが用意されている一方で、(少なくとも.NET 5時点までの)Pathクラスには拡張子を除くファイル名部分だけを置き換えるメソッド・ChangeFileNameのようなメソッドは用意されていません。 そのため、GetDirectoryNameメソッド・GetExtensionメソッドなどを組み合わせて独自に実装する必要があります。
以下はパスのうち、拡張子を除くファイル名部分を置き換えるメソッドを実装した例です。
この例で使用しているPath.Combineメソッドについては§.パスの結合 (Combine)を参照してください。
ドライブ名(ルートディレクトリ) (GetPathRoot)
ドライブ名だけを返すメソッドは用意されていませんが、GetPathRootメソッドでパスからルートディレクトリを取得できるので、これを使うことでドライブ名を取得することができます。
ただし、完全修飾されているパスの場合はホスト名を含めたドライブ名までの部分が返されるため、単にドライブ名だけを取得することはできません。 また、カレントドライブからの相対パスの場合も、ドライブのルートディレクトリ\
が返されるため、ドライブ名は取得できません。 ルートディレクトリを含まない相対パスの場合は、空の文字列が返されます。
GetPathRootメソッドの詳細な動作については§.ルートディレクトリの取得・ルートディレクトリからのパスかどうか (GetPathRoot/IsPathRooted)を参照してください。
パスの結合
ここではパス同士の結合、ディレクトリ区切り文字等について解説します。
パスの結合 (Combine)
ディレクトリ名とファイル名、親ディレクトリと子ディレクトリなど、個別の部分(断片)からなるパスを結合して一つのパスにするにはCombineメソッドを使います。
Combineメソッドでは、絶対パスと相対パスとの結合や、相対パス同士の結合を行うことができます。 引数に指定されたパスは実行環境のディレクトリ区切り文字にしたがって解釈され、結合時には必要に応じて区切り文字が自動的に補われます。 特に非Windows環境での\
は、区切りではなくディレクトリ名・ファイル名の一部として解釈された上で結合される点に注意が必要です。 また、パス内に含まれる".
"や"..
"は、正規化されずそのまま結合されます。 (パスの正規化を行うにはGetFullPathメソッドを使用します)
このメソッドでは、2つ以上の要素からなる任意個のパスを結合できます。 複数の文字列、あるいは文字列の配列として渡すことができる一方で、(少なくとも.NET 5までの時点では)IEnumerable<String>
を直接渡すことはできないため、ToArrayメソッドで配列に変換する必要があります。
Combineメソッドでは、引数に対してパスとして正しい形式となるような選択が行われます。 具体的には、引数リストにルートディレクトリからのパス(Path.IsPathRootedがtrueとなるパス)が指定されている場合、そのうちの一番最後をルートディレクトリとして選択した上でパスの結合を行います。 それより前のパスは結合に際して用いられず、無視されます。
ルートディレクトリからのパスかどうかの解釈は行わず、単にパス同士を連結させたい場合はPath.Joinメソッドを使用します。
階層構造を無視したパスの結合 (Join)
ルートディレクトリからのパスかどうかによって動作が変わるCombineメソッドとは異なり、Joinメソッドはパスの階層構造の解釈は行わず、単にパスの断片として結合を行います。 必要に応じてディレクトリ区切り文字が自動的に補われる点はCombineメソッドと同様です。
Joinメソッドでは結合された結果がパスとして正しい形式になるとは限らないため、常に正しい形式のパスとして結合したい場合はCombineメソッドを使用します。
ディレクトリ区切り文字 (DirectorySeparatorChar/AltDirectorySeparatorChar)
現在の実行環境におけるディレクトリ区切り文字を知りたい場合はDirectorySeparatorCharフィールドを参照します。 Pathクラスでは自動的に適切なディレクトリ区切り文字が使用されます。 例えば、Windows上では\
、非Windows環境では/
がディレクトリ区切り文字となります。
AltDirectorySeparatorCharフィールドからは、代替となるディレクトリ区切り文字を取得できます。 Windows上では、\
だけでなく/
をディレクトリ区切り文字として用いたパスもサポートされていて、この文字が代替ディレクトリ区切り文字として定義されています。 逆に、非Windows環境では/
のみがサポートされます。
なお、代替文字/
を含むパスをPathクラスで処理した場合、ディレクトリ区切り文字が\
に置き換えられる場合があります。
Path.DirectorySeparatorCharフィールドの値を見ることで現在の実行環境をある程度判別することもできますが、より厳密に判別する方法は別途用意されています。 詳しくはランタイム・システム・プラットフォームの情報 §.OSバージョンを参照してください。
パス区切り文字 (PathSeparator)
PathSeparatorフィールドを参照することで、現在の実行環境でのパス区切り文字を取得することができます。
ディレクトリ区切り文字(DirectorySeparatorChar)は単一のパス内におけるディレクトリ階層の区切りとして用いられる文字であるのに対して、パス区切り文字(PathSeparator)は複数パスを1行で記述する際の各パスの区切りとして用いられる文字を表します。 例えば環境変数PATH
で複数のパスを設定したい場合には、パスひとつひとつの間をこの文字で区切った上で連結します。 Windowsではパス区切り文字に;
、UNIX系では:
が用いられます。
Pathクラスでは複数パスを連結・分割するようなメソッドは直接提供されませんが、環境変数を扱う場合などにはこのフィールドから適切な区切り文字を取得することができます。
環境変数を取得・設定する方法などについては、環境変数を参照してください。
パス形式の変換・検証・正規化
ここでは絶対パス・相対パス形式の変換や正規化、パス形式の検証について解説します。
絶対パスの取得・パスの正規化 (GetFullPath)
正規化された絶対パスを取得するにはGetFullPathメソッドを使います。 このメソッドを呼び出すと、相対パスは解決された状態になり、正規化された絶対パス・ルートディレクトリを基準(あるいは基点、base)とするパスが返されます。 カレントドライブからの相対パス(\
で始まるパス)の場合も、ドライブ名を含む絶対パスに正規化されます。
.NET Standard 2.1/.NET Core 2.1以降では引数basePathを指定することができ、このパスを基準として相対パスが解決されます。 basePathには実在しないパスを指定することもできます。
また、basePathは常にディレクトリを表すものとして扱われるため、basePathがディレクトリ区切り文字で終端されているかどうかによって結果が変わることはありません。 当然、basePathに相対パスを指定することはできません
引数basePathを指定しないバージョンのGetFullPathメソッドを呼び出した場合、相対パスは常にカレントディレクトリを基準として解決されます。
Path.GetRelativePathメソッドを使うことで相対パスを取得することができます。
カレントディレクトリの取得・設定についてはプロセス・アセンブリの情報 §.カレントディレクトリを参照してください。
相対パスの取得 (GetRelativePath)
Path.GetRelativePathメソッドを使用することで、目的のパスと基準(あるいは基点、base)となるパスの2つの絶対パスから相対パスを取得することができます。
基準となるパスを表す引数relativeToは、常にディレクトリを表すものとして扱われるため、relativeToがディレクトリ区切り文字で終端されているかどうかによって結果が変わることはありません。 異なるドライブ間のパス同士の場合は、絶対パスとして結果が返されます。 (F:\from
→T:\to
の場合はT:\to
) 同一ドライブ内のパス同士の場合でも、カレントドライブからの相対パス形式とはならず、ディレクトリ間の相対パスとして結果が返されます。 (E:\from
→E:\to
の場合は\to
ではなく..\to
)
なお、GetRelativePathメソッドは.NET Standard 2.1/.NET Core 2.0以降で使用できます。 GetRelativePathメソッドが使用できない場合は、Uriクラスを使ってURIとして処理することにより相対パスを得られます。
絶対パスを取得するにはGetFullPathメソッドを使用します。
実行環境によってパスにおける大文字小文字の違いを意識/無視するかは異なり、例えばWindowsではdir
とDIR
は同じパスを表すと判断される一方、それ以外では異なるパスと判断される場合があります。
GetRelativePathメソッドは実行環境での大文字小文字の扱い方に応じて相対パスを作成します。 GetRelativePathメソッドでは大文字小文字の違いを意識/無視するかどうか、あるいはパスの比較に用いるIEqualityComparer<String>等を明示的に指定することはできません。
なお、GetRelativePathメソッドでのパス間の比較は、StringComparison.Ordinal/OrdinalIgnoreCaseでの比較が行われます。
厳密には、大文字小文字の扱われ方はファイルシステムごとに異なる一方、GetRelativePathメソッドはパスがどのファイルシステム上のエントリを表すものか、またそのファイルシステムでの扱われ方については関知しません。
Uriクラスを使った相対パスの取得
Pathクラスには絶対パスから相対パスを取得するメソッドは用意されていません。 代わりにUriクラスを使って相対パスを作成することができます。 以下に紹介する方法では、ファイルパスをURIとして扱い、Uriクラスのメソッドを使って相対パスに変換しています。
ルートディレクトリの取得・ルートディレクトリからのパスかどうか (GetPathRoot/IsPathRooted)
GetPathRootメソッドを使うことでパスからルートディレクトリを取得することができます。 ドライブ名を含むパスの場合は、ドライブ名も含めたルートディレクトリが返されます。 例えば、パスE:\dir
の場合はEドライブのルートディレクトリE:\
が返されます。 カレントドライブからの相対パス\dir
では、ドライブ名の指定がないルートディレクトリ\
のみが返されます。 (カレントディレクトリからの)相対パスなど、ルートディレクトリからのパスでない場合は、空の文字列が返されます。
また、パスがルートディレクトリから始まっているかどうか(ルートディレクトリからのパスであるか)を調べるにはIsPathRootedメソッドを使うことができます。 ルートディレクトリとして判断される基準はGetPathRootメソッドと同様です。
GetPathRoot・IsPathRootedメソッドではあくまでパス形式としての検証のみが行われるため、実在しないルートディレクトリの場合でも例外は発生しません。
パスがUNCパスなどの完全修飾になっているかどうかを調べるにはPath.IsPathFullyQualifiedメソッドを使うことができます。
完全修飾のパスかどうか (IsPathFullyQualified)
パスが完全修飾されている(fully-qualified)かどうかを調べるにはIsPathFullyQualifiedメソッドを使うことができます。 このメソッドでは、パスが特定のドライブ/デバイス/ボリューム内のディレクトリ/ファイルを表すものかどうかを判定します。
このため、UNCパスやDOSデバイスパスなど常に完全修飾となる形式のパスや、ドライブ名から始まるパスE:\dir
などの場合にtrue(完全修飾されている)を返します。 ルートディレクトリから始まるパス\dir
, /dir
などは、Windows環境ではfalse(完全修飾されていない)が返されます。 非Windows環境では、ルートディレクトリ/
から始まるパスに対してはtrue(完全修飾されている)を返します。
このメソッドではあくまでパス形式としての検証のみが行われるため、実在しないドライブ/デバイス/ボリュームの場合でも例外は発生しません。 また非Windows環境では、ルートディレクトリ/
から始まるパスのみが完全修飾されているものとして判断され、UNCパスやDOSデバイスパスは解釈されず、完全修飾されていないものと判断されます。
なお、IsPathFullyQualifiedメソッドは.NET Standard 2.1/.NET Core 2.1以降で使用できます。
ディレクトリ区切り文字で終端されているか・終端をトリミングする (EndsInDirectorySeparator/TrimEndingDirectorySeparator)
パスの末尾がディレクトリ区切り文字となっているかどうかを調べるにはEndsInDirectorySeparatorメソッドを使うことができます。 また、ディレクトリ区切り文字で終端されているパスから終端のディレクトリ区切り文字をトリミングするにはTrimEndingDirectorySeparatorメソッドを使うことができます。
EndsInDirectorySeparator・TrimEndingDirectorySeparatorメソッドは、ディレクトリを表すパスの場合は末尾が\
あるいは/
となっていることを要求したい場合、逆にパスがファイルでもディレクトリでも同一の表記で扱いたい場合などに用いることができます。
TrimEndingDirectorySeparatorメソッドは、E:\
,\
,/
などルートディレクトリを表すパスの場合は終端のトリミングは行いません。 そのため、このメソッドを使ってドライブ名(E:
)のみを取得することはできません。
なお、EndsInDirectorySeparator・TrimEndingDirectorySeparatorメソッドは.NET Standard 2.1/.NET Core 2.1以降で使用できます。
EndsInDirectorySeparator・TrimEndingDirectorySeparatorメソッドが使用できない場合は、DirectorySeparatorChar・AltDirectorySeparatorCharフィールドとString.EndsWithメソッド・String.TrimEndメソッドを組み合わせることで同様の処理を行うことができます。
パスやファイル名に使用できない文字の取得 (GetInvalidPathChars/GetInvalidFileNameChars)
パスやファイル名では、一部の制御文字・記号を使うことができません。 パスとして使用できない文字はGetInvalidPathCharsメソッド、ファイル名として使用できない文字はGetInvalidFileNameCharsメソッドによって、char
/Char
の配列として取得できます。 このメソッドでは、現在の実行環境において使用できない文字を返します。 GetInvalidFileNameCharsメソッドの返す結果には、ディレクトリ区切り文字は含まれません。
このメソッドが返す配列を用いることにより、例えばユーザーによって入力されたパスやファイル名などのバリデーション(妥当性の検証)を行うことができます。 なお、Pathクラスのメソッドは、パスに使用できない文字が含まれる場合に例外ArgumentExceptionをスローするものがあります。
一方で、Pathクラスにはパス・ファイル名に使用できない文字を別の文字に置き換えるようなメソッドは存在しません。 そのため、パス・ファイル名がユーザー入力などによって与えられるケースでは、何らかのルールを定義して妥当でない文字を別の文字に置換するなどしてからファイル操作を行う必要があります。
シェルや文字コードの種類・組み合わせによってはこれ以外の文字が特殊記号と誤認され、パス・ファイル名を原因とする意図しない動作となる場合があります。 この点についてはダメ文字を含むかどうかチェックするを参照してください。
GetRandomFileNameメソッドやGetTempFileNameメソッドを用いることで、妥当かつランダムなファイル名を生成することができます。 使用不可能な文字を含まない適当なファイル名が必要な場合には、これらのメソッドを用いることもできます。
ファイル名の生成
ランダムなファイル名の生成 (GetRandomFileName)
GetRandomFileNameメソッドを使うことにより、ランダムなファイル名が生成できます。 このメソッドは、呼び出しごとにランダムなファイル名を生成します。 ただし、ファイル名としての文字列が生成されるだけで、ファイルそのものは作成されません。
このメソッドでは、常にファイル名8文字.拡張子3文字
の形式のファイル名が生成されます。 生成されるファイル名はランダムではあるものの、衝突する可能性はあります。 そのため、このファイル名を使って書き込みを行うような場合は、事前にファイルが実在しないか調べ、存在する場合は再生成するなどの対処が必要になります。
また、このメソッドでは拡張子も含めてランダムなファイル名となるため、特定の拡張子でランダムなファイル名を生成したい場合はChangeExtensionメソッドと組み合わせて使用します。
一時ファイルの作成 (GetTempFileName)
GetTempFileNameメソッドを使うことにより、ランダムなファイル名でサイズが0
の一時ファイル(temporary file)を生成し、そのパスを取得することができます。
メソッド名はGetTempFileNameとなっているものの、このメソッドは呼び出しごとにファイルを生成し、そのパスを返す動作となっている点に注意してください。 生成されたファイルは一時ディレクトリ(temporary directory)配下に作成されるため、いずれかのタイミングで自動的に削除されることが期待できますが、必要なくなった時点でFile.Deleteメソッドを用いて速やかに削除することもできます。
Path.GetTempFileNameメソッドの動作、使用例については一時ディレクトリを取得する・一時ファイルを作成する §.一時ファイルの作成 (Path.GetTempFileName)を参照してください。