web-dev-qa-db-ja.com

C#/。NETでパスとファイル名を組み合わせる最良の方法は何ですか?

パスとファイル名を組み合わせる最良の方法は何ですか?

つまり、_c:\foo_および_bar.txt_を指定すると、_c:\foo\bar.txt_が必要です。

_c:\foo_および_..\bar.txt_が与えられた場合、エラーまたは_c:\foo\bar.txt_が必要です(したがって、Path.Combine()を直接使用することはできません)。 _c:\foo_および_bar/baz.txt_についても同様に、エラーまたは_c:\foo\baz.txt_(_c:\foo\bar\baz.txt_ではありません)が必要です。

ファイル名に「\」または「/」が含まれていないことを確認できましたが、それで十分ですか?そうでない場合、正しいチェックは何ですか?

61
Rasmus Faber

「悪い」ファイル名でエラーを生成する場合:

if (Path.GetFileName(fileName) != fileName)
{
    throw new Exception("'fileName' is invalid!");
}
string combined = Path.Combine(dir, fileName);

または、例外をスローせずに「不良」ファイル名を静かに修正したいだけの場合:

string combined = Path.Combine(dir, Path.GetFileName(fileName));
98
LukeH

次を使用できます。

Path.Combine(folder, Path.GetFileName(fileName))

または、\をスキップするには(テストされていないため、Path.GetFileNameがこれを自動的に処理します)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\")))
17
GvS

Path.Combine(arg1, arg2)を使用する場合、ユーザーがarg2の完全修飾ファイルパスを入力した場合、arg1は無視され、arg2をパスとして使用することに注意してください。

私の意見では、Microsoftはそこに台無しにした!これにより、ユーザーがファイルシステム全体をハッキングする可能性が高くなります。注意してください、細かい活字を読んでください!パスを組み合わせる場合は、var newPath = path1 + @"\" + path2;よりシンプルで予期しない結果はありません...

2
Ravi