Path.GetFullPath() रिश्तेदार रास्तों के साथ काम नहीं करता है।
यहाँ समाधान है कि दोनों रिश्तेदार + निरपेक्ष पथ के साथ काम करता है। यह लिनक्स + विंडोज दोनों पर काम करता है और यह ..पाठ की शुरुआत में उम्मीद के मुताबिक रहता है (बाकी वे सामान्यीकृत होंगे)। समाधान अभी भी Path.GetFullPathएक छोटे से समाधान के साथ तय करने के लिए पर निर्भर करता है ।
यह एक विस्तार विधि है इसलिए इसका उपयोग करें text.Canonicalize()
/// <summary>
/// Fixes "../.." etc
/// </summary>
public static string Canonicalize(this string path)
{
if (path.IsAbsolutePath())
return Path.GetFullPath(path);
var fakeRoot = Environment.CurrentDirectory; // Gives us a cross platform full path
var combined = Path.Combine(fakeRoot, path);
combined = Path.GetFullPath(combined);
return combined.RelativeTo(fakeRoot);
}
private static bool IsAbsolutePath(this string path)
{
if (path == null) throw new ArgumentNullException(nameof(path));
return
Path.IsPathRooted(path)
&& !Path.GetPathRoot(path).Equals(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)
&& !Path.GetPathRoot(path).Equals(Path.AltDirectorySeparatorChar.ToString(), StringComparison.Ordinal);
}
private static string RelativeTo(this string filespec, string folder)
{
var pathUri = new Uri(filespec);
// Folders must end in a slash
if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString())) folder += Path.DirectorySeparatorChar;
var folderUri = new Uri(folder);
return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString()
.Replace('/', Path.DirectorySeparatorChar));
}