Я программирую в WPF C #. У меня есть, например, следующий путь:
C:\Program Files\hello.txt
и я хочу извлечь hello
из него.
Путь string
извлекается из базы данных. В настоящее время я использую следующий код, чтобы разделить путь, '\'
а затем снова разделить на '.'
:
string path = "C:\\Program Files\\hello.txt";
string[] pathArr = path.Split('\\');
string[] fileArr = pathArr.Last().Split('.');
string fileName = fileArr.Last().ToString();
Это работает, но я считаю, что должно быть более короткое и разумное решение для этого. Любая идея?
Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")
возвращает ту же строку и по какой-то причине не преобразует ее в «file.cs». Если я копирую / вставляю свой код в онлайн-компилятор (например, rextester.com ), он работает ...?Ответы:
Path.GetFileName
Path.GetFileNameWithoutExtension
Класс Path замечательный.
источник
пытаться
http://msdn.microsoft.com/de-de/library/system.io.path.getfilename.aspx
источник
пытаться
демонстрация
https://msdn.microsoft.com/en-gb/library/system.io.path.getfilenamewithoutextension%28v=vs.80%29.aspx
источник
Вы можете использовать Path API следующим образом:
Дополнительная информация: Path.GetFileNameWithoutExtension
источник
Path.GetFileNameWithoutExtension
источник
Попробуй это:
Это вернет "привет" для fileName.
источник
источник
Попробуй это,
источник
источник
FileVersionInfo
может быть использован для файлов, которые не имеют информации о версии. Обратите внимание, что этоGetVersionInfo()
можно использовать только для путей, которые ссылаются на файл, который уже существует. Хотя любой класс можно использовать для получения имени файла, также задан вопрос об удалении расширения.Во-первых, код в вопросе не дает описанного вывода. Извлекает расширение файла (
"txt"
), а не базовое имя файла ("hello"
). Для этого нужно вызвать последнюю строкуFirst()
, а неLast()
так ...Сделав это изменение, нужно подумать о том, насколько улучшается этот код, это количество мусора, которое он создает:
string[]
, Содержащие одинstring
для каждого сегмента пути вpath
string[]
Содержащий , по меньшей мере , одинstring
для каждого.
сегмента пути в прошломpath
Таким образом, извлечение имени базового файла из пути образца
"C:\Program Files\hello.txt"
должно производить (временный)object
с"C:"
,"Program Files"
,"hello.txt"
,"hello"
,"txt"
, Astring[3]
, иstring[2]
. Это может быть важно, если метод вызывается по большому количеству путей. Чтобы улучшить это, мы можем искатьpath
себя, чтобы найти начальную и конечную точки базового имени и использовать их для создания одного новогоstring
...Это использует индекс символа после последнего
\
в качестве начала базового имени, и оттуда ищет первый,.
чтобы использовать в качестве индекса символа после конца базового имени. Это короче, чем оригинальный код? Не совсем. Это "умнее" решение? Я думаю так. По крайней мере, было бы, если бы не тот факт, что ...Как видно из комментария, предыдущий метод проблематичен. Хотя это работает, если вы предполагаете, что все пути заканчиваются именем файла с расширением, оно выдаст исключение, если путь заканчивается
\
(то есть путь к каталогу) или иным образом не содержит расширения в последнем сегменте. Чтобы это исправить, нам нужно добавить дополнительную проверку для учета, когдаendIndex
есть-1
(то.
есть не найден) ...Теперь эта версия далеко не короче оригинала, но она более эффективна и (теперь) правильна.
Что касается методов .NET, которые реализуют эту функциональность, многие другие ответы предлагают использовать
Path.GetFileNameWithoutExtension()
, что является очевидным, простым решением, но не дает таких же результатов, как код в вопросе. Существует тонкое, но важное различие междуGetFileBaseNameUsingSplit()
иPath.GetFileNameWithoutExtension()
(GetFileBaseNameUsingPath()
ниже): первое извлекает все до первого,.
а второе извлекает все до последнего.
. Это не имеет значения для образцаpath
в вопросе, но взгляните на эту таблицу, сравнивая результаты вышеупомянутых четырех методов при вызове с различными путями ...... и вы увидите, что это
Path.GetFileNameWithoutExtension()
дает разные результаты, когда передается путь, где имя файла имеет двойное расширение или начальный и / или конечный.
. Вы можете попробовать это сами с помощью следующего кода ...TL; DR Код в вопросе не ведет себя так, как многие ожидают в некоторых угловых случаях. Если вы собираетесь написать свой собственный код манипуляции с путями, обязательно примите во внимание ...
.
или все до последнего.
?).
.
(вероятно, это не то, с чем вы когда-либо сталкивались в Windows, но они возможны ).
\
Не все пути к файлам следуют обычной формуле
X:\Directory\File.ext
!источник
источник