Каков наилучший способ объединить путь и имя файла в C # /. NET? - PullRequest
60 голосов
/ 26 июня 2009

Как лучше всего объединить путь с именем файла?

То есть, учитывая 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).

Я понимаю, что могу проверить, что имя файла не содержит «\» или «/», но достаточно ли этого? Если нет, то какая проверка правильная?

Ответы [ 3 ]

96 голосов
/ 26 июня 2009

Если вы хотите, чтобы "плохие" имена файлов вызывали ошибку:

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));
17 голосов
/ 26 июня 2009

Вы можете использовать:

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

или, чтобы пропустить \ (не проверено, возможно Path.GetFileName обрабатывает это автоматически)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\")))
1 голос
/ 02 июня 2015

Помните, что когда вы используете Path.Combine(arg1, arg2) - если ваш пользователь вводит полный путь к файлу для arg2, он игнорирует arg1 и использует arg2 в качестве пути.

На мой взгляд, Microsoft облажалась там! Это может оставить вас широко открытыми для пользователя, взломавшего всю вашу файловую систему. Будьте внимательны, прочитайте мелкий шрифт! Если вы комбинируете пути, используйте: var newPath = path1 + @"\" + path2; проще и без неожиданных результатов ...

...