Sub Main
Dim Str As String
Dim Parsed As Object
Str = GetDocFullPath() ' "/home/user/document.ods" '
Parsed = ParseFilePath(Str)
MsgBox("FileDir:" + Parsed.FileDir) ' "/home/user/" '
MsgBox("FileName:" + Parsed.FileName) ' "document.ods" '
MsgBox("FileDirName:" + Parsed.FileDirName) ' "user" '
MsgBox("FileFullPath:" + Parsed.FileFullPath) ' "/home/user/document.ods" '
MsgBox("FileExtension:" + Parsed.FileExtension) ' "ods" '
MsgBox("FileDirNoSlash:" + Parsed.FileDirNoSlash) ' "/home/user" '
MsgBox("FileNameNoExtension:" + Parsed.FileNameNoExtension) ' "document" '
End Sub
Type FilePathParsedByParseFilePathFunction
FileDir As String
FileName As String
FileDirName As String
FileFullPath As String
FileExtension As String
FileDirNoSlash As String
FileNameNoExtension As String
End Type
Function ParseFilePath(ByVal FullPath As String) As Object
Dim i As Long
Dim PathLen As Long
Dim PathURL As String
Dim DirLenDiff As Long
Dim BaseNameLen As Long
Dim BaseDirectory As String
Dim BaseNameExtDiff As Long
Dim BaseNameLastDotIndex As Long
' Fetching file base name from FullPath '
' Converting to URL for Linux/Windows compatibility. '
' URL notation does not allow certain special characters to be used. '
' These are either replaced by other characters or encoded. A slash '
' (/) is used as a path separator. For example, a file referred to as '
' C:\My File.sxw on the local host in "Windows notation" becomes '
' file:///C|/My%20File.sxw in URL notation. '
' https://help.libreoffice.org/Basic/Basic_Glossary '
PathURL = ConvertToURL(FullPath)
ParseFilePath = CreateObject("FilePathParsedByParseFilePathFunction")
ParseFilePath.FileFullPath = FullPath
' FullPath could be mistakenly converted to http. For example: '
' ConvertToURL("many.dots.in.file.name.ods") will be misinterpreted. '
If Left(PathURL,7) <> "file://" Then
PathURL = ConvertToURL("/" + FullPath)
End If
PathLen = Len(PathURL)
For i = PathLen To 1 Step -1
If Mid(PathURL,i,1) = "/" Then
ParseFilePath.FileName = ConvertFromURL(Right(PathURL,PathLen - i))
Exit For
End If
Next i
' Finding last occurence of "." in the file name. First symbol is ignored '
' due to filenames starting with dot (.htaccess) have no extension. '
BaseNameLen = Len(ParseFilePath.FileName)
BaseNameLastDotIndex = BaseNameLen
For i = BaseNameLen To 2 Step -1
If Mid(ParseFilePath.FileName,i,1) = "." Then
BaseNameLastDotIndex = i
Exit For
End If
Next i
ParseFilePath.FileExtension = Right(ParseFilePath.FileName,BaseNameLen - BaseNameLastDotIndex)
BaseNameExtDiff = BaseNameLen - Len(ParseFilePath.FileExtension) - 1
If BaseNameExtDiff < 0 Then
BaseNameExtDiff = 0
End If
ParseFilePath.FileNameNoExtension = Left(ParseFilePath.FileName,BaseNameExtDiff)
' Getting directory name with slash and without. '
DirLenDiff = Len(FullPath) - Len(ParseFilePath.FileName)
ParseFilePath.FileDir = Left(FullPath,DirLenDiff)
DirLenDiff = DirLenDiff - 1
If DirLenDiff < 0 Then
DirLenDiff = 0
End If
ParseFilePath.FileDirNoSlash = Left(FullPath,DirLenDiff)
' Getting file directory name. '
PathURL = ConvertToURL(ParseFilePath.FileDirNoSlash)
If Left(PathURL,7) <> "file://" Then
PathURL = ConvertToURL("/" + ParseFilePath.FileDirNoSlash)
End If
PathLen = Len(PathURL)
For i = PathLen To 1 Step -1
If Mid(PathURL,i,1) = "/" Then
ParseFilePath.FileDirName = ConvertFromURL(Right(PathURL,PathLen - i))
Exit For
End If
Next i
End Function
' Returns document full path if document has a path. Returns empty string if '
' document has no path and IgnoreNoPathError flag is set to TRUE. '
Function GetDocFullPath(Optional IgnoreNoPathError as Boolean) As String
' Default behavior is to return empty string if document location is empty.'
' This can happen if document is new and not saved thus do not have a path.'
If NOT ThisComponent.hasLocation() AND IgnoreNoPathError <> TRUE Then
' Err.Raise is not valid statement but will generate error anyway. '
Err.Raise("Document has no path. Probably because is not saved.")
End If
GetDocFullPath = ConvertFromURL(ThisComponent.getLocation())
End Function
Описание:
Вышепредставленный программный код на бейсике для макросов либреофиса можно использовать чтобы парсить полный путь к файлу, получая из него все необходимые части: имя файла, расширение, имя директории, путь без имени файла, имя файла без расширения и т.п.