Page 1 of 1

getcurdir() y cgetfile()

Posted: Mon Sep 05, 2011 10:38 am
by Sebastián Almirón
Hola a todos,

el siguiente código:
Msgalert('Paso1: ' + getcurdir() )
cdesti := cGetFile('Archivos Excel (*.xls) | *.xls','Guardar libro',,,.t.,.t.,2,cname)
Msgalert('Paso2: ' + getcurdir() )

En el paso 1 me muestra el directorio de la aplicación, pero en el paso 2 me muestra la carpeta que haya elegido en el dialogo de seleccionar el fichero. Es decir cgetfile() cambia el valor del directorio actual. ¿ Existe manera de evitar esto ? o al menos una functión del tipo setcurdir() a la que pueda llamar inmediatamente después. Por ejemplo si tras un cgetfile() ocurre un error, el fichero .log me lo graba en la carpeta seleccionada en cGetfile() en vez de en la carpeta de la aplicación. Incluso cambia el SET DEFAULT TO, aunque esto lo puedo arreglar guardando el valor de getcurdir() en una variable al iniciar la aplicación y luego SET DEFAULT TO &variable, pero no en el caso de ficheros que quiero guardar automáticamente en la carpeta de la aplicación.

En FW16 con cgetfile32() no se cambiaba el valor del directorio actual y el mismo código devuelve en los dos pasos el mismo valor.

Saludos

Re: getcurdir() y cgetfile()

Posted: Mon Sep 05, 2011 1:23 pm
by karinha
talbéz:


Code: Select all

     cPath := CURDRIVE() + ":\" + GETCURDIR()

Re: getcurdir() y cgetfile()

Posted: Mon Sep 05, 2011 1:28 pm
by Bayron
Para obtener el directorio de la aplicacion deberias acerlo así:

Code: Select all

Msgalert('Paso2: ' + cFilePath( GetModuleFileName( GetInstance() ) ) )
 

Re: getcurdir() y cgetfile()

Posted: Mon Sep 05, 2011 2:20 pm
by Sebastián Almirón
Bueno, gracias por contestar, pero no se si me he explicado bien.

No se trata de obtener el path de la aplicación, de lo que se trara es de que curdir() devuelva lo mismo antes y después de llamar a cgetfile(), o si no hay más remedio, alguna función para que curdir() devuelva el path de la aplicación. Muchas funciones, tanto mias como de FW/Harbour, graban ficheros provisionales o de otro tipo en la carpeta de la aplicación sin indicarle en que carpeta debe crear esos ficheros, ya que por defecto se crean en la carpeta de la aplicación, lo mismo que hace por ejemplo MemoWrit() si como primer parámetro solo se le pasa un nombre de un fichero sin ruta.

Si tras llamar a cgetfile() provocamos un error, la llamada a memowrit() que hay en errsysw.prg, no crea el fichero error.log en la carpeta de la aplicación como debería ser, se crea en la carpeta seleccionada en cgetfile() y creo que eso no debería ser así. Este comprotamiento no ocurría en Clipper/FW16, donde siempre se guarda el fichero error.log en la carpeta de la aplicación, aunque hayamos usado cgetfile(). Lo de memowrit() es solo un ejemplo, ocurre con otras muchas funciones.

Saludos

Re: getcurdir() y cgetfile()

Posted: Mon Sep 05, 2011 2:35 pm
by karinha
Creo sea esto:

Code: Select all

FUNCTION XBLITE()  //->MAIN()

    MEMVAR cPRGPATH, cFILEPATH

    cPRGPATH := cFILEPATH(GETMODULEFILENAME(GETINSTANCE()))

    XBACKUPLITE()

    lCHDIR(cPRGPATH) //-> aca vuelve al directorio inicial.

RETURN NIL
 

Re: getcurdir() y cgetfile()

Posted: Wed Sep 07, 2011 11:46 am
by Sebastián Almirón
Gracias Karinha,

La función lchdir() es la que buscaba (nunca hasta ahora había tenido necesidad de utilizarla).

Pero insisto en que cgetfile() no debería cambiar el path (también cambia el SET DEFAULT), en su lugar me he hecho una functión llamada Getfile(), para sustiruirla:

function Getfile(cFileMask, cTitle, nDefaultMask, cInitialDirectory, lSave, nFlags, cInitialFile )
local cPRGPATH := cFILEPATH(GETMODULEFILENAME(GETINSTANCE())), sal := ''
sal := cGetfile(cFileMask, cTitle, nDefaultMask, cInitialDirectory, lSave, nFlags, cInitialFile )
lCHDIR(cPRGPATH)
SET DEFAULT TO //Mis dbfs están en el mismo directorio que la aplicación
return sal

Saludos