[C#]絕對路徑轉相對路徑
之前在做壓縮的函式庫時,有碰到一個需求是壓縮整個目錄的資料,目錄裡面可能又含有許多子目錄,要壓縮時會需要指派其在壓縮檔內的存放位置,故會需要將要壓縮的檔案位置轉換為相對路徑,壓縮檔內依其相對位置做存放。當初在做這個功能時,找了一下網路上的資料,多半找到的都是用遞迴下去自行處理,雖然運作良好,但程式在理解上會變得稍微困難一點。
最近再回過頭來稍微看了一下,發現.NET內建的Uri類別中就可以達到我們的需求,像是下面這樣透過MakeRelativeUri去取得兩個絕對路徑運算後的相對路徑:
static String GetRelativePath(String basePath, String targetPath) { Uri baseUri = new Uri(basePath); Uri targetUri = new Uri(targetPath); return baseUri.MakeRelativeUri(targetUri).ToString().Replace(@"/", @"\"); }
完整範例如下:
static void Main(string[] args) { String basePath = @"c:\test\123\456\789\"; // @"c:\test\123"; String targetPath = @"c:\test\123\"; // @"c:\test\123\456\789"; String relativePath = GetRelativePath(basePath, targetPath); Console.WriteLine("Base Path: " + basePath); Console.WriteLine("Target Path: " + targetPath); Console.WriteLine("Relative Path: " + relativePath); } static String GetRelativePath(String basePath, String targetPath) { Uri baseUri = new Uri(basePath); Uri targetUri = new Uri(targetPath); return baseUri.MakeRelativeUri(targetUri).ToString().Replace(@"/", @"\"); }
運行結果如下: