2016-04-27 112 views
0

因此,我正在使用C#中的WinSCP庫製作文件瀏覽器。來自遠程服務器的文件和文件夾被加載到一個ListView中,並且我在ListView_DoubleClick事件上有一個事件將會去獲取該文件夾的文件。但是我的問題是,從WinSCP返回的「CurrentPath」就像這樣構建; 「/ eddata/T」。現在,如果用戶返回一個目錄,返回的路徑是「/eddata/T/../」。如果用戶進入另一個名爲「Bob」的文件夾,則路徑現在看起來像; 「/eddata/T/../Bob」。在C#中格式化Linux路徑#

我想要一種方式,以便以用戶友好的方式顯示當前路徑。所以當用戶在目錄中時, 「/ eddata/T /」,他們上了一個級別,一個標籤應該告訴他們他們在; 「/ eddata /」;

這是我的嘗試,但未按預期工作,它不處理用戶同時備份兩個目錄的事件;

private string FormatPathString(string input) 
{ 

    String working = input; 

    bool replacement = true; 
    while (replacement) 
    { 
     string[] splits = working.Split('/'); 
     splits = splits.AsEnumerable().Where(x => x != String.Empty).ToArray(); 

     int? found_index = null; 

     for (int i = splits.Count() - 1; i > 0; i--) 
     { 
      if (splits[i] == "..") 
      { 
       found_index = i; 
       break; 
      } 
     } 

     if (found_index.HasValue) 
     { 
      replacement = true; 
      splits = splits.Where((val, idx) => (idx != found_index) && (idx != found_index - 1)).ToArray(); 
      working = String.Join("/", splits); 
     } 
     else 
     { 
      replacement = false; 
     } 

    } 

    return working; 
} 

回答

2

您可以使用Path類。

string pathWithDots= "/eddata/T/../Bob"; 

string pathWithoutDots = Path.GetFullPath(pathWithDots); // Result: c:\eddata\Bob 

然而Path類假定您使用的是Windows路徑,並增加了C:和變化斜槓反斜槓,所以你將需要刪除C:開始和替換所有回正斜槓斜槓。

string pathNx = pathWithoutDots.Substring(2).Replace("\\", "/"); // Result: /eddata/Bob 
+0

完美!謝謝! – Sam