none
¿Me ayudan a traducir esta pequeña función de VB6 a VB Net? RRS feed

  • Pregunta

  • Esta función:

    Public Function RutaLarga(cRutaCorta As String) As String
        Dim cMemoria As String( 260), nI As Long

        nI = GetLongPathName(cRutaCorta, cMemoria, Len(cMemoria))
        RutaLarga = Left$(cMemoria, nI)
      End Function

    ----------------------------

    Como referencia pongo GetLongPathName:

    <DllImport("kernel32.dll")>
      Private Shared Function GetlongPathName(ByVal lpszShortPath As String, ByVal lpszintptrPath As String, ByVal cchBuffer As IntPtr) As IntPtr
      End Function

    miércoles, 2 de agosto de 2017 3:00

Respuestas

  • Creo que esto servirá:

    Declare Auto Function GetLongPathName Lib "kernel32.dll" (
    	ByVal lpszShortPath As String,
    	ByVal lpszLongPath As StringBuilder,
    	ByVal cchBuffer As Integer) As Integer
    
    Public Function RutaLarga(cRutaCorta As String) As String
    
    	Dim cMemoria As New StringBuilder(256)
    
    	GetLongPathName(cRutaCorta, cMemoria, cMemoria.Capacity)
    
    	Return cMemoria.ToString()
    
    End Function

    - Test

    MessageBox.Show(RutaLarga("c:\PROGRA~1"))


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta James2016-2 miércoles, 2 de agosto de 2017 3:45
    miércoles, 2 de agosto de 2017 3:28
  • Hola:

    Si es un 'ejercicio', entonces traducir la función de VB6 a VB.NET literalmente es correcto, pero si es un caso real (estás creando una función para obtener la ruta larga), mejor evitar llamadas a la API y demás... y empezar a usar el .NET  framework, podrías sustituir la función por:

    Public Function RutaLarga(cRutaCorta As String) As String
    
       Return New IO.FileInfo("C:\Progra~1").FullName
    
    End Funcion
    
    

    O mejor aún, 'usar' el objeto IO.FileInfo (o IO.DirectoryInfo) en vez de funciones para trabajar con ficheros/directorios y todas sus propiedades (si existe o no, si es de solo lectura, etc.).

    Espero que te sirva.

    Un saludo

    • Marcado como respuesta James2016-2 miércoles, 2 de agosto de 2017 6:37
    miércoles, 2 de agosto de 2017 6:17

Todas las respuestas

  • Creo que esto servirá:

    Declare Auto Function GetLongPathName Lib "kernel32.dll" (
    	ByVal lpszShortPath As String,
    	ByVal lpszLongPath As StringBuilder,
    	ByVal cchBuffer As Integer) As Integer
    
    Public Function RutaLarga(cRutaCorta As String) As String
    
    	Dim cMemoria As New StringBuilder(256)
    
    	GetLongPathName(cRutaCorta, cMemoria, cMemoria.Capacity)
    
    	Return cMemoria.ToString()
    
    End Function

    - Test

    MessageBox.Show(RutaLarga("c:\PROGRA~1"))


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta James2016-2 miércoles, 2 de agosto de 2017 3:45
    miércoles, 2 de agosto de 2017 3:28
  • Gracias.
    miércoles, 2 de agosto de 2017 3:45
  • Hola:

    Si es un 'ejercicio', entonces traducir la función de VB6 a VB.NET literalmente es correcto, pero si es un caso real (estás creando una función para obtener la ruta larga), mejor evitar llamadas a la API y demás... y empezar a usar el .NET  framework, podrías sustituir la función por:

    Public Function RutaLarga(cRutaCorta As String) As String
    
       Return New IO.FileInfo("C:\Progra~1").FullName
    
    End Funcion
    
    

    O mejor aún, 'usar' el objeto IO.FileInfo (o IO.DirectoryInfo) en vez de funciones para trabajar con ficheros/directorios y todas sus propiedades (si existe o no, si es de solo lectura, etc.).

    Espero que te sirva.

    Un saludo

    • Marcado como respuesta James2016-2 miércoles, 2 de agosto de 2017 6:37
    miércoles, 2 de agosto de 2017 6:17
  • Sí gracias, trataba de traducirlo usando API de Windows. Veo que a diferencia de VB6, VB Net ofrece más alternativas al punto que en varios casos se puede prescindir de la API y hacerlo como dices con Framework de una manera más eficiente, más corta y directa por lo menos.
    miércoles, 2 de agosto de 2017 6:36
  • Desconocía que la función FullName() permitía convertir un identificador de directorio o nombre de archivo basado en un nombre corto, de hecho no tenía bastante claro el concepto de 'nombre corto de archivo' que ahora entiendo se trata de una restricción del sistema de archivos (FAT) soportado por los sistemas operativos antiguos. Gracias LG DES por la observación.
    miércoles, 2 de agosto de 2017 14:16