Извлечь имя файла из пути - PullRequest
12 голосов
/ 09 мая 2011

Мне нужно извлечь имя файла из пути (строки):

например., "C: \ folder \ folder \ folder \ file.txt" = "file" (или даже "file.txt", чтобы начать работу)

По сути, все до и включая последнее \

Я слышал об использовании подстановочных знаков вместо Regex (так как это странная реализация в VBA?), Но не могу найти ничего хорошего.

Приветствия заранее.

Ответы [ 8 ]

20 голосов
/ 09 мая 2011

Я считаю, что это работает, используя VBA:

Dim strPath As String
strPath = "C:\folder\folder\folder\file.txt"

Dim strFile As String
strFile = Right(strPath, Len(strPath) - InStrRev(strPath, "\"))

InStrRev ищет первый экземпляр "\" с конца и возвращает позицию.Right создает подстроку, начинающуюся справа заданной длины, поэтому вы вычисляете необходимую длину, используя Len - InStrRev

6 голосов
/ 11 мая 2011

Спасибо kaveman за помощь.Вот полный код, который я использовал для удаления как пути, так и расширения (он не является полным доказательством, не учитывает файлы, содержащие более 2 десятичных знаков, например, * .tar.gz)

sFullPath = "C:\dir\dir\dir\file.txt"   
sFullFilename = Right(sFullPath, Len(sFullPath) - InStrRev(sFullPath, "\"))
sFilename = Left(sFullFilename, (InStr(sFullFilename, ".") - 1))

sFilename = "file"

5 голосов
/ 23 августа 2013

Я искал решение без кода.Этот VBA работает в строке формул Excel:

Чтобы извлечь имя файла:

=RIGHT(A1,LEN(A1)-FIND("~",SUBSTITUTE(A1,"\","~",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))

Чтобы извлечь путь к файлу:

=MID(A1,1,LEN(A1)-LEN(MID(A1,FIND(CHAR(1),SUBSTITUTE(A1,"\",CHAR(1),LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))))
1 голос
/ 09 мая 2011

Использование Java:

String myPath="C:\folder\folder\folder\file.txt";
System.out.println("filename " +  myPath.lastIndexOf('\\'));
0 голосов
/ 25 апреля 2018

Вот более простой метод: однострочная функция для извлечения только имя - без расширения файла - как вы указали в в вашем примере :

Function getName(pf):getName=Split(Mid(pf,InStrRev(pf,"\")+1),".")(0):End Function

... поэтому, используя ваш пример, это:

MsgBox getName("C:\folder\folder\folder\file.txt")

возвращает:

Для случаев, когда вы хотите извлечь имя файла при , сохраняя расширение файла , или если вы хотите извлечь только путь , вот еще две однострочные функции :

Извлечь имя файла из x:\path\filename:

Function getFName(pf)As String:getFName=Mid(pf,InStrRev(pf,"\")+1):End Function

Извлечь путь из x:\path\filename:

Function getPath(pf)As String: getPath=Left(pf,InStrRev(pf,"\")): End Function

Примеры:
examples

( Источник )

0 голосов
/ 13 марта 2017

Для этого вы можете использовать FileSystemObject.

Во-первых, включите ссылку для de Microsoft Scripting Runtime ( Строка меню редактора VB> Инструменты> Ссылки ).

После этого вы можете использовать такую ​​функцию, как эта:

Function Get_FileName_fromPath(myPath as string) as string
    Dim FSO as New Scripting.FileSystemObject

    'Check if File Exists before getting the name
    iF FSO.FileExists(myPath) then
        Get_FileName_fromPath = FSO.GetFileName(myPath)
    Else
        Get_FileName_fromPath = "File not found!"
    End if
End Function

Объекты файловой системы очень полезны для манипулирования файлами, особенно при проверке их существования и перемещении. Мне нравится использовать их с ранним связыванием (оператор Dim), но вы можете использовать их с поздним связыванием, если хотите (оператор CreateObject).

0 голосов
/ 14 сентября 2014

`Вы также можете попробовать:

Sub filen() Dim parts() As String Dim Inputfolder As String, a As String 'Takes input as any file on disk Inputfolder = Application.GetOpenFilename("Folder, *") parts = Split(Inputfolder, "\") a = parts(UBound(parts())) MsgBox ("File is: " & a) End Sub

Этот сабвуфер может отображать имя папки любого файла

0 голосов
/ 11 сентября 2014

Я также успешно использовал предложение kaveman, чтобы получить полное имя файла, но иногда, когда в моем полном имени файла много точек, я использовал следующее, чтобы избавиться от бита .txt:

FileName = Left(FullFileName, (InStrRev(FullFileName, ".") - 1))
...