Каков наилучший способ комбинировать путь и имя файла в С#/. 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
).
Я понимаю, я мог проверить, что имя файла не содержит '\' или '/', но этого достаточно? Если нет, какова правильная проверка?
Ответы
Ответ 1
Если вы хотите, чтобы "плохие" имена файлов генерировали ошибку:
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));
Ответ 2
Вы можете использовать:
Path.Combine(folder, Path.GetFileName(fileName))
или, чтобы пропустить\(не тестировалось, возможно, Path.GetFileName обрабатывает это автоматически)
Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\")))
Ответ 3
Помните, что когда вы используете Path.Combine(arg1, arg2)
- если ваш пользователь вводит полностью квалифицированный путь к файлу для arg2, он игнорирует arg1 и использует arg2 в качестве пути.
По-моему, Microsoft прищурилась! Это может оставить вас широко открытыми, когда пользователь взломает всю вашу файловую систему. Будьте осторожны, прочитайте мелкий шрифт! Если вы комбинируете пути, используйте: var newPath = path1 + @"\" + path2;
проще и без неожиданных результатов...