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)