2014-02-26 134 views
1

我有兩個項目,並從該文件夾中的圖像加載一個共享庫得到一個文件夾的相對: "C:/MainProject/Project1/Images/"如何從兩個不同的項目

PROJECT1的文件夾: "C:/MainProject/Project1/Files/Bin/x86/Debug"(其中有PROJECT1.EXE)

Project2中的文件夾:"C:/MainProject/Project2/Bin/x86/Debug"(其中有project2.exe)

當我調用共享庫函數來加載圖像,我需要取得的「圖片」文件夾中的相對路徑,因爲我會打電話從功能project1或project2。另外我會將我的MainProject移動到其他計算機上,所以我不能使用絕對路徑。

從PROJECT1我會做:

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName + @"\Images"; 

從Project2的,我會做:

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName + @"Project1\Images"; 

我怎樣才能獲得兩個工程文件夾中的相對路徑?

回答

2

您可能想要稍微測試一下這段代碼,並使其更加健壯,但只要您不傳遞UNC地址,就應該能夠工作。 它通過將路徑分割成目錄名稱並將它們從左到右進行比較來工作。然後建立一條相對路徑。

public static string GetRelativePath(string sourcePath, string targetPath) 
    { 
     if (!Path.IsPathRooted(sourcePath)) throw new ArgumentException("Path must be absolute", "sourcePath"); 
     if (!Path.IsPathRooted(targetPath)) throw new ArgumentException("Path must be absolute", "targetPath"); 

     string[] sourceParts = sourcePath.Split(Path.DirectorySeparatorChar); 
     string[] targetParts = targetPath.Split(Path.DirectorySeparatorChar); 

     int n; 
     for (n = 0; n < Math.Min(sourceParts.Length, targetParts.Length); n++) 
     { 
      if (!string.Equals(sourceParts[n], targetParts[n], StringComparison.CurrentCultureIgnoreCase)) 
      { 
       break; 
      } 
     } 

     if (n == 0) throw new ApplicationException("Files must be on the same volume"); 
     string relativePath = new string('.', sourceParts.Length - n).Replace(".", ".." + Path.DirectorySeparatorChar); 
     if (n <= targetParts.Length) 
     { 
      relativePath += string.Join(Path.DirectorySeparatorChar.ToString(), targetParts.Skip(n).ToArray()); 
     } 

     return string.IsNullOrWhiteSpace(relativePath) ? "." : relativePath; 
    } 

而不是使用Directory.GetCurrentDirectory的,(Process.GetCurrentProcess()。MainModule.FileName)考慮使用Path.GetDirectory。你的當前目錄可能與你的exe文件不同,這會破壞你的代碼。 MainModule.FileName直接指向你的exe文件的位置。

0

我的建議是保持exes所在的共享(images)目錄。換句話說,您的項目的安裝文件夾。現在要找到安裝目錄,請使用以下代碼: -

var imageFolderName = "SharedImage"; 
    var loc = System.Reflection.Assembly.GetExecutingAssembly().Location; 
    var imagePath = Path.Combine(loc, imageFolderName); 
相關問題