我需要从路径(字符串)中提取文件名:
如, “C:\ folder \ folder \ folder \ file.txt”=“file”(甚至“file.txt”让我入门)
基本上包括最后一个\
之前的所有内容我听说使用通配符代替Regex(因为它在VBA中是一个奇怪的实现?)但是找不到任何可靠的东西。
提前干杯。
答案 0 :(得分:19)
我相信这很有用,使用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
答案 1 :(得分:5)
感谢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”
答案 2 :(得分:5)
我一直在寻找没有代码的解决方案。此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))))
答案 3 :(得分:1)
使用Java:
String myPath="C:\folder\folder\folder\file.txt";
System.out.println("filename " + myPath.lastIndexOf('\\'));
答案 4 :(得分:0)
我成功地使用了kaveman的建议来获取完整文件名,但有时当我的完整文件名中有很多Dots时,我使用以下内容来删除.txt位:
FileName = Left(FullFileName, (InStrRev(FullFileName, ".") - 1))
答案 5 :(得分:0)
`您也可以尝试:
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
此子目录可以显示任何文件的文件夹名称
答案 6 :(得分:0)
您可以使用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语句)。
答案 7 :(得分:0)
以下更简单的方法:单行功能提取仅名称 - 没有文件扩展名 - 正如您在your example中指定的那样:
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
<强>示例:强>
(Source)功能
答案 8 :(得分:0)
'[/vba] ' 把事情简单化 ' .. 为什么在 Left 和 Mid 时使用 FileSystemObject 或 Split ' FSO 有大约 33 个 Subs 或 Functions 每次创建时都必须加载。 ' 并且需要文件存在......但只是慢了一点
... 两次以下... FSO 中的一些不错的代码 ' 守恒是好的.. 节省一些电子。 ????...节省几百万分之一秒
'还有 ' .. 为什么我们都使用的函数格式像 ' ' .. 函数 GetAStr(x) 作为字符串
'将 extraStr 调暗为字符串
' 使用 extraStr 进行了大量工作.. ' 可以用字符串变量 GetAStr 完成 已经由函数创建
' 然后 .. GetAStr=extraStr 把它放在正确的位置 ' .. 结束函数
函数 GetNameL1$(FilePath$, 可选 NLess& = 1)
' 默认 Nless=1 => 仅名称 ' NLess =2 => xcopya.xls xcopyb.xls xcopy7.xlsm 全部为 xcopy 以获取最新版本 ' Nless = - 4 或更少 => name with name.ext worka.xlsm
GetNameL1 = Mid(FilePath, InStrRev(FilePath, "") + 1)
GetNameL1 = Left(GetNameL1, InStrRev(GetNameL1, ".") - NLess)
结束函数
函数 LastFold$(FilePath$)
LastFold = Left(FilePath, InStrRev(FilePath, "") - 1)
LastFold = Mid(LastFold, InStrRev(LastFold, "") + 1)
结束函数
函数 LastFoldSA$(FilePath$)
Dim SA$(): SA = Split(FilePath, "")
LastFoldSA = SA(UBound(SA) - 1)
结束函数
[