缩小文件路径的功能更易于人类阅读

And*_*tes 5 .net c# filepath

c#中是否有任何函数可以使文件路径闪烁?

输入:"c:\ users\Windows\Downloaded Program Files\Folder\Inside\example\file.txt"

输出:"c:\ users\...\example\file.txt"

Orn*_*son 6

这对我来说看起来不那么人性化.无论如何,我认为没有这样的功能.将它拆分在\字符上,只保留前两个插槽和最后两个插槽即可.

这样的东西,虽然代码不是很优雅

  string[] splits = path.Split('\\');
  Console.WriteLine( splits[0] + "\\" + splits[1] + "\\...\\" + splits[splits.Length - 2] + "\\" +  splits[splits.Length - 1]);
Run Code Online (Sandbox Code Playgroud)

  • 我也会在那里添加一个`if(splits.Length> 4)`测试. (2认同)

Nas*_*ine 6

Jeff Atwood在他的博客上发布了一个解决方案,这里是:

[DllImport("shlwapi.dll", CharSet = CharSet.Auto)]
static extern bool PathCompactPathEx([Out] StringBuilder pszOut, string szPath, int cchMax, int dwFlags);

static string PathShortener(string path, int length)
{
    StringBuilder sb = new StringBuilder();
    PathCompactPathEx(sb, path, length, 0);
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

它使用非托管功能PathCompactPathEx来实现您想要的。

  • @v.oddou 它对我来说也崩溃了,直到我看到 [Daniele 的解决方案](http://stackoverflow.com/a/22328545/107625) 它使用另一个构造函数:`sb = new StringBuilder(length + 1) `. (4认同)
  • 奇怪的是,这在 3.5 框架中运行良好,我更新到 vs 2010 和框架 4,现在我在这条线上遇到了无法调试的崩溃。(visual studio 很忙...)切换到`CharSet.Ansi`“解决”(?)问题。 (3认同)
  • 当心:这会崩溃(至少在最近的 .NET 框架中),因为 `StringBuilder` [默认分配 16 个字符](http://stackoverflow.com/questions/246211/default-capacity-of-stringbuilder),这通常是不足以存储结果。您需要使用 length 或 MAX_PATH = 260 以避免可能的内存损坏。 (2认同)

Oli*_*bes 5

如果需要,请根据路径字符串的长度插入省略号,然后使用以下代码:

TextRenderer.MeasureText(path, Font, 
    new System.Drawing.Size(Width, 0),
    TextFormatFlags.PathEllipsis | TextFormatFlags.ModifyString);
Run Code Online (Sandbox Code Playgroud)

它将path就地修改。

编辑:请小心使用此方法。它打破了规则,称 .NET 中的字符串是不可变的。事实上,该MeasureText方法的第一个参数不是ref参数,这意味着不能返回新的字符串。相反,现有字符串会被更改。处理使用以下命令创建的副本时要小心

string temp = String.Copy(path);
Run Code Online (Sandbox Code Playgroud)


小智 5

纳斯达丁的答案几乎是正确的。在您的情况下,只需指定StringBuilder的大小即可:

[DllImport("shlwapi.dll", CharSet = CharSet.Auto)]
static extern bool PathCompactPathEx(
                       [Out] StringBuilder pszOut, 
                       string szPath, 
                       int cchMax, 
                       int dwFlags);

static string PathShortener(string path, int length)
{
    StringBuilder sb = new StringBuilder(length + 1);
    PathCompactPathEx(sb, path, length, 0);
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)