15 de abril de 2009

Reemplazo para SYS(2014)

Artículo original: Replacement for SYS(2014) 
http://doughennig.blogspot.com/2009/03/replacement-for-sys2014.html
Autor: Doug Hennig
Traducido por: Luis María Guayán

SYS(2014) es una pequeña gran función que ayuda a hacer sus aplicaciones portátiles. Como retorna la ruta relativa de un archivo, a una carpeta específica, se puede utilizar en un nombre de archivo absoluto (como el que retorna GETFILE()) y almacenar la ruta relativa, en lugar de la ruta absoluta.

Sin embargo, una cosa que siempre digo sobre SYS(2014), es que retorna la ruta en mayúsculas. Si se desea mostrar la ruta de acceso para el usuario, ellos preguntarán por qué la ruta está toda en en mayusculas en el programa, y diferente en el disco.

Afortunadamente, hay una simple función API de Windows que usted ae puede llamar, que hace lo mismo que SYS(2014), pero respeta las mayúsculas y minusculas. El siguiente es un ejemplo de cómo utilizar esta función:

(ACTUALIZACION: Walt Krzystek señaló que GetRelativePath retornó una cadena en blanco si las dos rutas se encuentran en unidades diferentes. Además, yo olvidé quitar los espacios al valor devuelto.)

*- Ejemplo de ambas funciones
lcFile = "C:\VFP\Desarrollo\Programa.prg" 
lcPath = "C:\VFP\Aplicaciones\"

? SYS(2014, lcFile, lcPath)
? GetRelativePath(lcFile, lcPath)

FUNCTION GetRelativePath(tcTo, tcFrom)
  #DEFINE FILE_ATTRIBUTE_DIRECTORY 0x10
  #DEFINE FILE_ATTRIBUTE_NORMAL 0x80
  #DEFINE MAX_PATH 260
  
  DECLARE INTEGER PathRelativePathTo IN shlwapi.DLL ;
    STRING @out, STRING @from, INTEGER fromattrib, ;
    STRING @to, INTEGER toattrib

  lcPath = SPACE(MAX_PATH)
  lcFrom = IIF(VARTYPE(tcFrom) = 'C', tcFrom, ;
    SYS(5) + CURDIR()) + CHR(0)
  lnFromAttrib = IIF(DIRECTORY(lcFrom), FILE_ATTRIBUTE_DIRECTORY, ;
    FILE_ATTRIBUTE_NORMAL)
  lcTo = IIF(VARTYPE(tcTo) = 'C', tcTo, ;
    SYS(5) + CURDIR()) + CHR(0)
  lnToAttrib = IIF(DIRECTORY(lcTo), FILE_ATTRIBUTE_DIRECTORY, ;
    FILE_ATTRIBUTE_NORMAL)
    
  PathRelativePathTo(@lcPath, @lcFrom, lnFromAttrib, @lcTo, lnToAttrib)

  lcPath = ALLTRIM(STRTRAN(lcPath, CHR(0), ' '))

  IF EMPTY(lcPath)
    lcPath = tcTo
  ENDIF EMPTY(lcPath)

  RETURN lcPath
ENDFUNC

No hay comentarios. :

Publicar un comentario