Quantcast
Viewing latest article 14
Browse Latest Browse All 25

Answer by AMissico for How to get relative path from absolute path

You want to use the CommonPath method of this RelativePath class. Once you have the common path, just strip it out of the path you want to display.

Namespace IO.Path    Public NotInheritable Class RelativePath        Private Declare Function PathRelativePathTo Lib "shlwapi" Alias "PathRelativePathToA" ( _            ByVal pszPath As String, _            ByVal pszFrom As String, _            ByVal dwAttrFrom As Integer, _            ByVal pszTo As String, _            ByVal dwAttrTo As Integer) As Integer        Private Declare Function PathCanonicalize Lib "shlwapi" Alias "PathCanonicalizeA" ( _            ByVal pszBuf As String, _            ByVal pszPath As String) As Integer        Private Const FILE_ATTRIBUTE_DIRECTORY As Short = &H10S        Private Const MAX_PATH As Short = 260        Private _path As String        Private _isDirectory As Boolean#Region " Constructors "        Public Sub New()        End Sub        Public Sub New(ByVal path As String)            _path = path        End Sub        Public Sub New(ByVal path As String, ByVal isDirectory As Boolean)            _path = path            _isDirectory = isDirectory        End Sub#End Region        Private Shared Function StripNulls(ByVal value As String) As String            StripNulls = value            If (InStr(value, vbNullChar) > 0) Then                StripNulls = Left(value, InStr(value, vbNullChar) - 1)            End If        End Function        Private Shared Function TrimCurrentDirectory(ByVal path As String) As String            TrimCurrentDirectory = path            If Len(path) >= 2 And Left(path, 2) = ".\" Then                TrimCurrentDirectory = Mid(path, 3)            End If        End Function'''<summary>''' 3. conforming to general principles: conforming to accepted principles or standard practice'''</summary>        Public Shared Function Canonicalize(ByVal path As String) As String            Dim sPath As String            sPath = New String(Chr(0), MAX_PATH)            If PathCanonicalize(sPath, path) = 0 Then                Canonicalize = vbNullString            Else                Canonicalize = StripNulls(sPath)            End If        End Function'''<summary>''' Returns the most common path between two paths.'''</summary>'''<remarks>'''<para>returns the path that is common between two paths</para>'''<para>c:\FolderA\FolderB\FolderC</para>'''   c:\FolderA\FolderD\FolderE\File.Ext''''''   results in:'''       c:\FolderA\'''</remarks>        Public Shared Function CommonPath(ByVal path1 As String, ByVal path2 As String) As String'returns the path that is common between two paths''   c:\FolderA\FolderB\FolderC'   c:\FolderA\FolderD\FolderE\File.Ext''   results in:'       c:\FolderA\            Dim sResult As String = String.Empty            Dim iPos1, iPos2 As Integer            path1 = Canonicalize(path1)            path2 = Canonicalize(path2)            Do                If Left(path1, iPos1) = Left(path2, iPos2) Then                    sResult = Left(path1, iPos1)                End If                iPos1 = InStr(iPos1 + 1, path1, "\")                iPos2 = InStr(iPos2 + 1, path1, "\")            Loop While Left(path1, iPos1) = Left(path2, iPos2)            Return sResult        End Function        Public Function CommonPath(ByVal path As String) As String            Return CommonPath(_path, path)        End Function        Public Shared Function RelativePathTo(ByVal source As String, ByVal isSourceDirectory As Boolean, ByVal target As String, ByVal isTargetDirectory As Boolean) As String'DEVLIB'   05/23/05  1:47PM - Fixed call to PathRelativePathTo, iTargetAttribute is now passed to dwAttrTo instead of IsTargetDirectory.'       For Visual Basic 6.0, the fix does not change testing results,'           because when the Boolean IsTargetDirectory is converted to the Long dwAttrTo it happens to contain FILE_ATTRIBUTE_DIRECTORY,'            Dim sRelativePath As String            Dim iSourceAttribute, iTargetAttribute As Integer            sRelativePath = New String(Chr(0), MAX_PATH)            source = Canonicalize(source)            target = Canonicalize(target)            If isSourceDirectory Then                iSourceAttribute = FILE_ATTRIBUTE_DIRECTORY            End If            If isTargetDirectory Then                iTargetAttribute = FILE_ATTRIBUTE_DIRECTORY            End If            If PathRelativePathTo(sRelativePath, source, iSourceAttribute, target, iTargetAttribute) = 0 Then                RelativePathTo = vbNullString            Else                RelativePathTo = TrimCurrentDirectory(StripNulls(sRelativePath))            End If        End Function        Public Function RelativePath(ByVal target As String) As String            Return RelativePathTo(_path, _isDirectory, target, False)        End Function    End ClassEnd Namespace

Viewing latest article 14
Browse Latest Browse All 25

Trending Articles