una solo ruta obtener nombres nombre net macro leer extension con carpeta archivos archivo vba unicode path

vba - solo - Obtener la ruta completa con el nombre de archivo Unicode



obtener ruta de un archivo vb net (2)

Tengo una ruta en versión corta o en formato DOS ( "C: / DOCUME ~ 1", por ejemplo) y quiero obtener la ruta completa / larga de ella ( "C: / Documents And Settings", por ejemplo).

Intenté la API GetLongPathName. Funcionó. Pero cuando se trata de un nombre de archivo unicode, falla.

Private Declare Function GetLongPathName Lib "kernel32" Alias _ "GetLongPathNameA" (ByVal lpszShortPath As String, _ ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long

Intenté alias GetLongPathNameW en su lugar pero parece no hacer nada, tanto para el nombre de archivo Unicode como para el que no es Unicode, siempre devuelven 0. En MSDN solo hay un artículo sobre GetLongPathNameW para C / C ++, no ninguno para VB / VBA. ¿Puedo hacer algo mal?

¿Hay alguna solución para este caso? Paso horas en Google y StackOverflow pero no puedo encontrarlo.

Saludos,


¿Esto funciona para tí? He convertido la ruta del archivo a nombre de ruta corta y luego la convertí de nuevo, lo que da la cadena correcta incluso cuando es unicode (por ejemplo, C: / Tö +)

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _ (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal lBuffer As Long) As Long Private Declare Function GetLongPathName Lib "kernel32" Alias "GetLongPathNameA" _ (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long Public Function GetShortPath(ByVal strFileName As String) As String ''KPD-Team 1999 ''URL: [url]http://www.allapi.net/[/url] ''E-Mail: [email][email protected][/email] Dim lngRes As Long, strPath As String ''Create a buffer strPath = String$(165, 0) ''retrieve the short pathname lngRes = GetShortPathName(strFileName, strPath, 164) ''remove all unnecessary chr$(0)''s GetShortPath = Left$(strPath, lngRes) End Function Public Function GetLongPath(ByVal strFileName As String) As String Dim lngRes As Long, strPath As String ''Create a buffer strPath = String$(165, 0) ''retrieve the long pathname lngRes = GetLongPathName(strFileName, strPath, 164) ''remove all unnecessary chr$(0)''s GetLongPath = Left$(strPath, lngRes) End Function Private Sub Test() shortpath = GetShortPath("C:/Documents And Settings") Longpath = GetLongPath(shortpath) End Sub


Para usar las funciones W de vb6 / vba, declara todos los parámetros de cadena como largos:

Private Declare Function GetLongPathName Lib "kernel32" Alias "GetLongPathNameW" _ (ByVal lpszShortPath As Long, _ ByVal lpszLongPath As Long, _ ByVal cchBuffer As Long) As Long

y pase StrPtr(a_string) lugar de simplemente a_string .

Entonces si tuvieras:

dim s_path as string dim l_path as string s_path = "C:/DOCUME~1" l_path = string$(1024, vbnullchar) GetLongPathNameA s_path, l_path, len(l_path)

se convertiría

dim s_path as string dim l_path as string s_path = "C:/DOCUME~1" l_path = string$(1024, vbnullchar) GetLongPathNameW strptr(s_path), strptr(l_path), len(l_path)