PathCompactPath (shlwapi)
Last changed: -92.124.113.170

.
Summary
Truncates a file path to fit within a given pixel width by replacing path components with ellipses. The path parameter must be preallocated to MAX_PATH length in order to avoid a buffer overrun / corruption.

C# Signature:

[DllImport("shlwapi.dll", CharSet=CharSet.Auto)]
static extern bool PathCompactPath(IntPtr hDC, [In, Out] StringBuilder pszPath, int dx);

VB.NET Signature

''' <summary>
''' Truncates a file path to fit within a given pixel width by replacing path components with ellipses.
''' </summary>
''' <param name="hDC">A handle to the device context used for font metrics. This value can be NULL.</param>
''' <param name="lpszPath">A pointer to a null-terminated string of length MAX_PATH that contains the path to be modified. On return, this buffer will contain the modified string.</param>
''' <param name="dx">The width, in pixels, in which the string must fit.</param>
''' <returns>Returns TRUE if the path was successfully compacted to the specified width. Returns FALSE on failure, or if the base portion of the path would not fit the specified width.</returns>
<DllImport("shlwapi.dll", EntryPoint:="PathCompactPathW",  SetLastError:=True, CharSet:=CharSet.Unicode)> _
Public Function PathCompactPath(hDC As IntPtr, _
                <MarshalAs(UnmanagedType.LPTStr)>lpszPath As System.Text.StringBuilder, _
                dx As UInteger) As <MarshalAs(UnmanagedType.Bool)>Boolean
End Function

VB Signature:

Public Declare Function PathCompactPath Lib "shlwapi" Alias "PathCompactPathA" _
        (ByVal hDC As Long, _
         ByVal lpszPath As String, _
         ByVal dx As Long) As Long

User-Defined Types:

None.

Notes:

If you do not have a HDC available, take a look at PathCompactPathEx

Tips & Tricks:

Please add some!

Sample Code:

C# Sample Code:

public partial class frmMain : Form
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Auto)]
    static extern bool PathCompactPath(IntPtr hDC, [In, Out] StringBuilder pszPath, int dx);

    public string PathCompactPath(string path, int pixel)
    {
    Graphics gc = this.CreateGraphics();
    StringBuilder strBuffer = new StringBuilder(path);
    PathCompactPath((IntPtr)gc.GetHdc(), strBuffer, pixel);
    return strBuffer.ToString();
    }
}

VB.NET Sample Code:

Public Partial Class frmMain
     Inherits System.Windows.Forms.Form
    <DllImport("shlwapi.dll", EntryPoint:="PathCompactPathW",  SetLastError:=True, CharSet:=CharSet.Unicode)> _
    Public Function PathCompactPath(hDC As IntPtr, _
                <MarshalAs(UnmanagedType.LPTStr)>lpszPath As System.Text.StringBuilder, _
                dx As UInteger) As <MarshalAs(UnmanagedType.Bool)>Boolean
    End Function

    Public Function PathCompactPath(path As String, pixel As Integer) As String
      Dim gc As Graphics  = Me.CreateGraphics()
      Dim strBuffer As New StringBuilder(path);
      PathCompactPath(gc.GetHdc(), strBuffer, pixel)
      Return strBuffer.ToString()
    End Function
End Class

Alternative Managed API:

Do you know one? Please contribute it!

Documentation