[C#]絕對路徑轉相對路徑

  • 18365
  • 0
  • C#
  • 2011-03-18

[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(@"/", @"\");
}

 

運行結果如下:

image