从路径中提取文件名

时间:2011-05-09 05:32:31

标签: vba wildcard

我需要从路径(字符串)中提取文件名:

如, “C:\ folder \ folder \ folder \ file.txt”=“file”(甚至“file.txt”让我入门)

基本上包括最后一个\

之前的所有内容

我听说使用通配符代替Regex(因为它在VBA中是一个奇怪的实现?)但是找不到任何可靠的东西。

提前干杯。

9 个答案:

答案 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")

返回:

"file"

如果您想在保留文件扩展名时提取文件名,或者如果您想提取唯一的路径,则此处还有两个单行功能

  

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

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)

结束函数

[