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

Описание:
Вышепредставленный программный код на бейсике для макросов либреофиса можно использовать чтобы парсить полный путь к файлу, получая из него все необходимые части: имя файла, расширение, имя директории, путь без имени файла, имя файла без расширения и т.п.

Leave a Reply

*