这里几乎所有的答案都通过计算字符来缩短路径字符串。
但是这种方法忽略了每个字符的宽度。
这些是 30 个“W”字符:
WWWWWWWWWWWWWWWWWWWWWWWWWWWW
这些是 30 个“i”字符:
iiiiiiiiiiiiiiiiiiiiiiiiiiiiii
如您所见,计算字符并不是很有用。
而且您无需编写自己的代码,因为 Windows API 自 Windows 95 起就具有此功能。
此功能的名称是“路径省略号”。
Windows API DrawTextW() 有一个标志 DT_PATH_ELLIPSIS 正是这样做的。
在 .NET 框架中,这在 TextRenderer 类中可用(无需使用 PInvoke)。
有两种使用方法:
1.) 将路径直接绘制到标签中:
public class PathLabel : Label
{
protected override void OnPaint(PaintEventArgs e)
{
if (AutoSize)
throw new Exception("You must set "+Name+".AutoSize = false in VS "
+ "Designer and assign a fix width to the PathLabel.");
Color c_Fore = Enabled ? ForeColor : SystemColors.GrayText;
TextRenderer.DrawText(e.Graphics, Text, Font, ClientRectangle, c_Fore,
BackColor, TextFormatFlags.PathEllipsis);
}
}
此标签要求您在 Visual Studio 设计器中关闭 AutoEllipsis,并为标签分配一个固定宽度(路径应占据的最大宽度)。
您甚至可以在 Visual Studio 设计器中看到截断的路径。
我输入了一条不适合标签的长路径:
C:\WINDOWS\Installer{40BF1E83-20EB-11D8-97C5-0009C5020658}\ARPPRODUCTICON.exe
即使在 Visual Studio 设计器中也显示如下:
2.) 缩短路径而不将其绘制在屏幕上:
public static String ShortenPath(String s_Path, Font i_Font, int s32_Width)
{
TextRenderer.MeasureText(s_Path, i_Font, new Size(s32_Width, 100),
TextFormatFlags.PathEllipsis | TextFormatFlags.ModifyString);
// Windows inserts a '\0' character into the string instead of shortening the string
int s32_Nul = s_Path.IndexOf((Char)0);
if (s32_Nul > 0)
s_Path = s_Path.Substring(0, s32_Nul);
return s_Path;
}
标志TextFormatFlags.ModifyString 将'\0' 字符插入到字符串中。在 C# 中修改字符串是非常不寻常的。
通常字符串是不可变的。
这是因为底层 API DrawTextW() 以这种方式工作。
但是由于字符串只是被缩短并且永远不会变得更长,因此没有缓冲区溢出的风险。
以下代码
String s_Text = @"C:\WINDOWS\Installer{40BF1E83-20EB-11D8-97C5-0009C5020658}\ARPPRODUCTICON.exe";
s_Text = ShortenPath(s_Text, new Font("Arial", 12), 500);
将导致“C:\WINDOWS\Installer{40BF1E83-20EB-1...\ARPPRODUCTICON.exe”