[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError=true)]
static extern uint GetShortPathName(
[MarshalAs(UnmanagedType.LPTStr)]
string lpszLongPath,
[MarshalAs(UnmanagedType.LPTStr)]
StringBuilder lpszShortPath,
uint cchBuffer);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint GetShortPathName(string lpszLongPath, char[] lpszShortPath, int cchBuffer);
// To ensure that paths are not limited to MAX_PATH, use this signature within .NET
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, EntryPoint = "GetShortPathNameW", SetLastError = true)]
static extern int GetShortPathName(string pathName, System.Text.StringBuilder shortName, int cbShortName);
Imports System.Runtime.InteropServices
'/// KSG Comments: This code has only been tested for .NET 2.x
Public Class Interop
<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function GetShortPathName(ByVal longPath As String, _
<MarshalAs(UnmanagedType.LPTStr)> ByVal ShortPath As System.Text.StringBuilder, _
<MarshalAs(Runtime.InteropServices.UnmanagedType.U4)> ByVal bufferSize As Integer) As Integer
End Function
End Class
'OR
Declare Unicode Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameW" (ByVal longPath As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal ShortPath As System.Text.StringBuilder, <MarshalAs(UnmanagedType.U4)> ByVal bufferSize As Integer) As Integer
[DllImport("kernel32.dll", CharSet = CharSet::Auto, SetLastError=true)]
static int GetShortPathName(
[MarshalAs(UnmanagedType::LPTStr)]
String^ lpszLongPath,
[MarshalAs(UnmanagedType::LPTStr)]
System::Text::StringBuilder^ lpszShortPath,
unsigned int cchBuffer);
None.
Important! The file must actually exist, otherwise you'll get an empty path
Please add some!
/// <summary>
/// The ToLongPathNameToShortPathName function retrieves the short path form of a specified long input path
/// </summary>
/// <param name="longName">The long name path</param>
/// <returns>A short name path string</returns>
public static string ToShortPathName(string longName)
{
uint bufferSize = 256;
// donĀ“t allocate stringbuilder here but outside of the function for fast access
StringBuilder shortNameBuffer = new StringBuilder((int)bufferSize);
GetShortPathName(longName, shortNameBuffer, bufferSize);
return shortNameBuffer.ToString();
}
public string ShortPath(string longpath)
{
char[] buffer = new char[256];
GetShortPathName(longpath, buffer, buffer.Length);
return new string(buffer);
}
// Memory friendly version with error checking
public static string GetShortPathName(string longFileName)
{
int sz = GetShortPathName(longFileName, null, 0);
if (sz == 0)
throw new Win32Exception();
var sb = new StringBuilder(sz + 1);
sz = GetShortPathName(longFileName, sb, sb.Capacity);
if (sz == 0)
throw new Win32Exception();
return sb.ToString();
}
/// KSG Comments:
/// Unlike the sample above I am check for the return code in the event of an error
/// KSG Changed declaration for .NET 2.x 01/25/2007
Public Class Interop
<Runtime.InteropServices.DllImport("kernel32.dll", SetLastError:=True, CharSet:=Runtime.InteropServices.CharSet.Auto)> _
Public Shared Function GetShortPathName(ByVal longPath As String, _
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.LPTStr)> _
ByVal ShortPath As System.Text.StringBuilder, _
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.U4)> _
ByVal bufferSize As Integer) As Integer
End Function
End Class
Function ShortPathName(ByVal Path As String) As String
Dim sb As New System.Text.StringBuilder(1024)
Dim tempVal As Integer = Interop.GetShortPathName(Path, sb, 1024)
If tempVal <> 0 Then
Dim Result As String = sb.ToString()
Return Result
Else
Throw New Exception("Failed to return a short path")
End If
End Function
Do you know one? Please contribute it!
from http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/a036e28f-51e7-4f0c-874f-de139210e049
Neither of these works in VB2005 Express.
Ok, I have been playing with this a bit more & found a solution...this is VB2005 Express.
I was trying to put the "GetShortName" into a module and calling it from my Form (as I am used to doing). What I found, and it works for some reason, was to put this in my module:
Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Integer) As Integer
...And I had to put this actually in the form in my event (Me.ComboBox1.DblClick):
Dim RetVal As Integer
Dim ShortFileName As String
Dim GetShortFileName As String
ShortFileName = Microsoft.VisualBasic.Space(260)
RetVal = GetShortPathName(FindMedia, ShortFileName, Microsoft.VisualBasic.Len(ShortFileName))
GetShortFileName = Microsoft.VisualBasic.Left(ShortFileName, RetVal)
MsgBox(GetShortFileName)
Spaghetti code, yes, but at least it works