3 çözümler:
En iyi durum senaryosu, sen çağıran süreç dosya sistemi tam erişime sahip olacak% 100 kesin. Ikaz: Bir üretim kutuyu izni zaman özgür değiliz
public static string PathCombineAndCanonicalize1(string path1, string path2)
{
string combined = Path.Combine(path1, path2);
combined = Path.GetFullPath(combined);
return combined;
}
yanıltıcı olabilir ama olabilir. Çoğunlukla dizisi aritmetiğini izinsiz yapmanız gerekir. Bunun için yerel bir çağrı var. Ikaz: yerli çağrı
public static string PathCombineAndCanonicalize2(string path1, string path2)
{
string combined = Path.Combine(path1, path2);
StringBuilder sb = new StringBuilder(Math.Max(260, 2 * combined.Length));
PathCanonicalize(sb, combined);
return sb.ToString();
}
[DllImport("shlwapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool PathCanonicalize([Out] StringBuilder dst, string src);
Üçüncü strateji için tatil CLR kandırmaktır. Path.GetFullPath() sadece kurgusal bir yolda çalışıyor, bu yüzden her zaman bir tane verdiğinizden emin olun. Ne yapabilirsiniz sahte UNC yolu ile kök değiş tokuş etmek, GetFullPath() arayın ve sonra geri gerçeğini takas Ikaz:. bu kod incelemede bir sabit satmak isteyebilir
public static string PathCombineAndCanonicalize3(string path1, string path2)
{
string originalRoot = string.Empty;
if (Path.IsPathRooted(path1))
{
originalRoot = Path.GetPathRoot(path1);
path1 = path1.Substring(originalRoot.Length);
}
string fakeRoot = @"\\thiscantbe\real\";
string combined = Path.Combine(fakeRoot, path1, path2);
combined = Path.GetFullPath(combined);
combined = combined.Substring(fakeRoot.Length);
combined = Path.Combine(originalRoot, combined);
return combined;
}