[DllImport("shlwapi.dll", CharSet=CharSet.Auto)]
static extern bool PathRelativePathTo(
[Out] StringBuilder pszPath,
[In] string pszFrom,
[In] FileAttributes dwAttrFrom,
[In] string pszTo,
[In] FileAttributes dwAttrTo
);
<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
None.
None.
The Microsoft.VisualBasic.FileAttribute enumeration can be used to specify the file attribute
const Int32 MAX_PATH = 260;
StringBuilder str = new StringBuilder(MAX_PATH);
Boolean bRet = PathRelativePathTo(
str,
@"c:\a\b\path", FileAttributes.Directory,
@"c:\a\x\y\file", FileAttributes.Normal
);
// Result: str.ToString() == @"..\..\x\y\file"
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!