3 giải pháp:
kịch bản trường hợp tốt nhất, bạn đang ở đâu chắc chắn 100% quá trình gọi điện thoại sẽ có quyền truy cập đầy đủ vào hệ thống tập tin. caveat: phép trên hộp sản xuất có thể được khôn lanh
public static string PathCombineAndCanonicalize1(string path1, string path2)
{
string combined = Path.Combine(path1, path2);
combined = Path.GetFullPath(combined);
return combined;
}
Nhưng, chúng tôi không phải lúc nào miễn phí. Thường thì bạn cần phải thực hiện chuỗi số học mà không được phép. Có một cuộc gọi riêng cho việc này. caveat: khu nghỉ mát để gọi mẹ đẻ
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);
Một chiến lược thứ ba là để lừa CLR. Path.GetFullPath() hoạt động tốt trên một con đường hư cấu, vì vậy chỉ cần chắc chắn rằng bạn luôn luôn cho nó một. Những gì bạn có thể làm là trao đổi trên các gốc với một đường dẫn UNC giả mạo, hãy gọi GetFullPath(), và sau đó trao đổi một thực trở lại trong caveat:. này có thể đòi hỏi một bán khó khăn trong xét mã
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;
}
Nguồn
2015-02-02 23:56:54