LongPaths y ShortPaths

Iniciado por el_c0c0, 3 Enero 2009, 01:40 AM

0 Miembros y 1 Visitante están viendo este tema.

el_c0c0

eh bueno, feliz año nuevo che.

el otro dia estaba desarrollando una nueva version de un cliente para cyber (algunos del foro de rvb se acuerdan de los screens que una vez subi).. en fin, esta version esta hecha bien, espero poder venderla =)..

Pero esto que tiene que ver?, bueno facil: hay que listar los exes en memoria y compararlos con una lista de aplicaciones que no se deben cerrar y algunas paths de los exes en memoria, como el caso del AVG, estan en short path.. si saben, hay un api para hacer un path short o long (es obvio, podria hacer los dos paths shorts, pero queria ver porque no funcionaba el api), pero el problema que si uno quiere el path long desde un path short, el api no devuelve lo que esperamos.

hasta el momento seguro que no entendieron ni medio.. vamos con ejemplos:

Short Path o formato 8.3:
C:\DOCUME~1\el_c0c0\ESCRIT~1\ESCRIT~1\WINDOW~1\WINDOW~1
Long Paht:
C:\Documents and Settings\el_c0c0\Escritorio\Escritorio\Windows_Vista_Wallpapers_HD_X\Windows_Vista_Wallpapers_HD_X

con el api GetShortPathName, obtenemos del long path, el short path..
pero con el api GetFullPathName, no obtenemos el long path a partir del short path..


eso nos da que pensar no?.

en fin, yo con mis ganas de hacer cagadas y funciones estupidas que no sirven de una *****, les dejo el source de esto que sirve para sacar del short path un long path... esta hecha asi nomas, por lo que se funciona con archivos.. pero esta ideada para carpetas. Ojo que si no existe va a flashear cualquier cosa, pero va a devolver false...

linken: http://santiagohssl.googlepages.com/testLongPath.rar

saludos y ya saben que este codigo no es muy bueno.. pero bueno es lo que hay..

saludos
'-     coco
"Te voy a romper el orto"- Las hemorroides

seba123neo

te entendi perfectamente..proba usar la api GetLongPathName,aca te paso un ejemplo facil:

Código (vb) [Seleccionar]
Option Explicit
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.dll" Alias "GetLongPathNameA" (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long

Private Function GetShortPath(strFileName As String) As String
    Dim lngRes As Long, strPath As String
    strPath = String$(165, 0)
    lngRes = GetShortPathName(strFileName, strPath, 164)
    GetShortPath = Left$(strPath, lngRes)
End Function

Private Sub Form_Load()
    Dim PathCorto As String, PathLargo As String
    PathCorto = GetShortPath("C:\Archivos de Programa\Mozilla Firefox\firefox.exe")
    'esto te devuelve C:\ARCHIV~1\MOZILL~1\firefox.exe
    PathLargo = String(255, 0)
    Call GetLongPathName(PathCorto, PathLargo, 255)
    PathLargo = Replace(PathLargo, Chr(0), vbNullString)
    MsgBox PathLargo, vbInformation
End Sub


saludos.

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

el_c0c0

Cita de: seba123neo en  3 Enero 2009, 02:20 AM
te entendi perfectamente..proba usar la api GetLongPathName,aca te paso un ejemplo facil:

Código (vb) [Seleccionar]
Option Explicit
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.dll" Alias "GetLongPathNameA" (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long

Private Function GetShortPath(strFileName As String) As String
    Dim lngRes As Long, strPath As String
    strPath = String$(165, 0)
    lngRes = GetShortPathName(strFileName, strPath, 164)
    GetShortPath = Left$(strPath, lngRes)
End Function

Private Sub Form_Load()
    Dim PathCorto As String, PathLargo As String
    PathCorto = GetShortPath("C:\Archivos de Programa\Mozilla Firefox\firefox.exe")
    'esto te devuelve C:\ARCHIV~1\MOZILL~1\firefox.exe
    PathLargo = String(255, 0)
    Call GetLongPathName(PathCorto, PathLargo, 255)
    PathLargo = Replace(PathLargo, Chr(0), vbNullString)
    MsgBox PathLargo, vbInformation
End Sub


saludos.



epetacular seba, sabes cual fue el problema? el api guide no la tiene a esa funcion (por lo menos el mio) :P...

saludos
'-     coco
"Te voy a romper el orto"- Las hemorroides

Karcrack

No has de guiarte solo de las funciones que hay en el APIGuide, usa tambien la MSDN y el APIViewer ;D

http://msdn.microsoft.com/en-us/library/aa364980(VS.85).aspx

Saludos ;D