PathRelativePathTo (shlwapi)
Last changed: -165.225.80.101

.
Summary
Creates a relative path from one file or folder to another.

C# Signature:

[DllImport("shlwapi.dll", CharSet=CharSet.Auto)]
static extern bool PathRelativePathTo(
     [Out] StringBuilder pszPath,
     [In] string pszFrom,
     [In] uint dwAttrFrom,
     [In] string pszTo,
     [In] uint dwAttrTo
);

VB Signature:

<DllImport("shlwapi.dll", CharSet:=CharSet.Auto)> _
Public Shared Function PathRelativePathTo( _
     ByVal pszPath As StringBuilder, _
     ByVal pszFrom As String, _
     ByVal dwAttrFrom As Integer, _
     ByVal pszTo As String, _
     ByVal dwAttrTo As Integer) As Boolean
End Function

User-Defined Types:

None.

Notes:

None.

Tips & Tricks:

The Microsoft.VisualBasic.FileAttribute enumeration can be used to specify the file attribute

Sample Code:

const UInt32 FILE_ATTRIBUTE_DIRECTORY = 0x10;
const Int32 MAX_PATH = 260;
StringBuilder str = new StringBuilder(MAX_PATH);
UInt32 dwAttr1 = FILE_ATTRIBUTE_DIRECTORY;
UInt32 dwAttr2 = 0;
Boolean bRet = PathRelativePathTo(
     str,
     @"c:\a\b\path", dwAttr1,
     @"c:\a\x\y\file", dwAttr2
     );
// Result: str.ToString() == @"..\..\x\y\file"

Alternative Managed API:

    public static string GetRelativePath(FileSystemInfo path1, FileSystemInfo path2) {
      if (path1 == null) throw new ArgumentNullException("path1");
      if (path2 == null) throw new ArgumentNullException("path2");

      Func<FileSystemInfo, string> getFullName = delegate(FileSystemInfo path) {
    string fullName = path.FullName;

    if (path is DirectoryInfo) {
      if (fullName[fullName.Length - 1] != Path.DirectorySeparatorChar) {
        fullName += Path.DirectorySeparatorChar;
      }
    }
    return fullName;
      };

      string path1FullName = getFullName(path1);
      string path2FullName = getFullName(path2);

      Uri uri1 = new Uri(path1FullName);
      Uri uri2 = new Uri(path2FullName);
      Uri relativeUri = uri1.MakeRelativeUri(uri2);

      return relativeUri.OriginalString;
    }

Do you know one? Please contribute it!

Documentation