2011-12-06 13 views
6

長いパスを特定の長さに切り捨てたい。しかし、私は中に省略記号を入れたい。例えば途中に省略記号がある長いパス

\\my\long\path\is\really\long\and\it\needs\to\be\truncated は(35文字に切り捨て)となるべきである:\\my\long\path\is...to\be\truncated

標準機能または拡張方法はありますか?

+0

これはまた、http://stackoverflow.com/questions/8360360/c-sharp-function-to-shrink-file-path-to-be-more-human-readbleでもよく尋ねられます –

答えて

4

標準の機能や拡張方法はありませんので、自分でロールする必要があります。

長さを確認してください。

var truncated = ts.Substring(0, 16) + "..." + ts.Substring((ts.Length - 16), 16); 
+0

受け入れられました。私はそれをやっている同様のコードを持って、ちょうどそれをよりきれいにしたい。 – Vivek

1

これは、ここで

// Specify max width of resulting file name 
    const int MAX_WIDTH = 50; 

    // Specify long file name 
    string fileName = @"A:\LongPath\CanBe\AnyPathYou\SpecifyHere.txt"; 

    // Find last '\' character 
    int i = fileName.LastIndexOf('\\'); 

    string tokenRight = fileName.Substring(i, fileName.Length - i); 
    string tokenCenter = @"\..."; 
    string tokenLeft = fileName.Substring(0, MAX_WIDTH-(tokenRight.Length + tokenCenter.Length)); 

    string shortFileName = tokenLeft + tokenCenter + tokenRight; 
4

の作品、私が使用するものです。パスの真ん中に省略記号を作成し、長さや区切り文字を指定することもできます。

注これは、あなたがそう`"c:\path\file.foo".EllipsisString()

のようにそれを使用することができますので、私はあなたがwhileループを必要と疑う拡張メソッドで実際にあなたはおそらく、私がきちんと

public static string EllipsisString(this string rawString, int maxLength = 30, char delimiter = '\\') 
    { 
     maxLength -= 3; //account for delimiter spacing 

     if (rawString.Length <= maxLength) 
     { 
      return rawString; 
     } 

     string final = rawString; 
     List<string> parts; 

     int loops = 0; 
     while (loops++ < 100) 
     { 
      parts = rawString.Split(delimiter).ToList(); 
      parts.RemoveRange(parts.Count - 1 - loops, loops); 
      if (parts.Count == 1) 
      { 
       return parts.Last(); 
      } 

      parts.Insert(parts.Count - 1, "..."); 
      final = string.Join(delimiter.ToString(), parts); 
      if (final.Length < maxLength) 
      { 
       return final; 
      } 
     } 

     return rawString.Split(delimiter).ToList().Last(); 
    } 
をテストすることがあまりにも忙しかったしません。
関連する問題