validar si un archivo está abierto o en uso

2,463 views
Skip to first unread message

euronv

unread,
Dec 29, 2016, 2:22:09 PM12/29/16
to Comunidad de Visual Foxpro en Español
Hola amigos del foro les comento el siguiente caso:

En mi aplicación necesito efectuar varias operaciones con documentos (word, excel, pdf, etc) y para ello requiero que el programa valide antes si estos archivos están abiertos por otra aplicación, de ser positivo emitir un mensaje de error, dar una pausa para que el usuario cierre el documento en cuestión y luego continuar con el proceso, pude ubicar en el foro el siguiente código:

nOpen = FOPEN( "tuArchivo", 2 ) 
IF nOpen > 0 
           =FCLOSE( "tuArchivo" ) 
ELSE 
          WAIT WINDOW  "El archivo esta abierto" NOWAIT 
Endif

Efectivamente funciona dando el aviso cuando el archivo esta siendo utilizado por otra aplicación pero cuando lo cierro para luego continuar con el proceso en mi programa, éste arroja un error indicando de que el archivo esta siendo utilizado cuando de hecho esta cerrado se supone que la funcion FCLOSE deberia cerrar el documento pero en el caso especifico de la prueba que estoy haciendo con un archivo Word el documento se cierra pero WINWORD.EXE queda activo en memoria siendo la causa que origina el error

¿alguien conoce de alguna alternativa?

Gracias anticipadas por el soporte que bien puedan brindarme

Saludos 

Germán Fabricio Valdez

unread,
Dec 29, 2016, 7:45:41 PM12/29/16
to Comunidad de Visual Foxpro en Español
en lugar de fopen(,2) cambialo por fopen(,12)

Germán Fabricio Valdez

unread,
Dec 29, 2016, 7:47:51 PM12/29/16
to Comunidad de Visual Foxpro en Español
igual es fclose(nopen)


El jueves, 29 de diciembre de 2016, 16:22:09 (UTC-3), euronv escribió:

Euro Nava

unread,
Dec 30, 2016, 8:30:31 AM12/30/16
to publice...@googlegroups.com

Negativo aun arroja el error

 

 

Saludos

 

 

 

El presente correo y sus anexos son exclusivamente para el uso de los destinatarios indicados en el encabezado del mismo, pueden contener información confidencial y/o privilegiada. Si usted por error ha recibido la presente correspondencia agradezco hacer omisión de esta y hacerme del conocimiento por esta misma vía    

 

Bendito el Hombre que ha sido llamado por Cristo para ser el soldado del ejército en cuya mano empuñe como arma la palabra de Dios


Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.com
Versión: 2016.0.7924 / Base de datos de virus: 4739/13673 - Fecha de la versión: 30/12/2016

Fidel Charny

unread,
Dec 31, 2016, 6:28:24 AM12/31/16
to Comunidad de Visual Foxpro en Español
Prueba con:
if nOpen # -1
     fclose(nOpen)
endif

HernanCano

unread,
Jan 1, 2017, 8:21:30 PM1/1/17
to Comunidad de Visual Foxpro en Español
Colega:
Lo que debes hacer es lo que dices: "...dar una pausa para que el usuario cierre el documento en cuestión...". Ello lo logras con =MessageBox("Cuando cierre el archivo, pulse Aceptar").

Pero entonces debes asegurar que nuevamente se chequee que el archivo ya esté disponible.

local I
I=100000 && verifica una cantidad adecuada a la velocidad de tu computador... debe dar unos tres segundos (te propongo).
do while .t.
   M.nOpen = FOPEN( "tuArchivo", 2 ) 
   IF M.nOpen > 0 
      =FCLOSE( "tuArchivo" ) 
      exit
   ELSE 
      WAIT WINDOW  "El archivo está abierto" NOWAIT 
      =MessageBox("Cuando cierre el archivo, pulse Aceptar")
   Endif
   I=I-1
   if I<1
      if MessageBox("Mucho tiempo. ¿Continuar?",4)<>6
         exit
      endif
      I=100000 && verifica.....
   endif
enddo




ZeRoberto

unread,
Jan 1, 2017, 8:31:37 PM1/1/17
to publicesvfoxpro
Deberia ser

 =FCLOSE(m.nOpen) 

HernanCano

unread,
Jan 2, 2017, 12:07:51 AM1/2/17
to Comunidad de Visual Foxpro en Español
Sí, Ze Roberto.

Gracias.

Repito el mensaje...


El domingo, 1 de enero de 2017, 20:31:37 (UTC-5), Ze Roberto escribió:
Deberia ser

 =FCLOSE(m.nOpen) 

HernanCano

unread,
Jan 2, 2017, 12:09:57 AM1/2/17
to Comunidad de Visual Foxpro en Español
-------------------------------------
Corrigiendo...
-------------------------------------

Colega:
Lo que debes hacer es lo que dices: "...dar una pausa para que el usuario cierre el documento en cuestión...". Ello lo logras con =MessageBox("Cuando cierre el archivo, pulse Aceptar").

Pero entonces debes asegurar que nuevamente se chequee que el archivo ya esté disponible.

local I
I=100000 && verifica una cantidad adecuada a la velocidad de tu computador... debe dar unos tres segundos (te propongo).
do while .t.
   M.nOpen = FOPEN( "tuArchivo", 2 ) 
   IF M.nOpen > 0 
      =FCLOSE(m.nOpen) && estaba mal en el primer mensaje...
      exit
   ELSE 

Euro Nava

unread,
Jan 2, 2017, 9:19:33 AM1/2/17
to publice...@googlegroups.com

 

Gracias por responder Hernan pero eso ya lo hice, y sin embargo el problema persiste

 

Saludos y Feliz Año nuevo a todos los amigos del Foro desean exitos en esta nueva etapa

 

 

 

El presente correo y sus anexos son exclusivamente para el uso de los destinatarios indicados en el encabezado del mismo, pueden contener información confidencial y/o privilegiada. Si usted por error ha recibido la presente correspondencia agradezco hacer omisión de esta y hacerme del conocimiento por esta misma vía    

 

Bendito el Hombre que ha sido llamado por Cristo para ser el soldado del ejército en cuya mano empuñe como arma la palabra de Dios

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de HernanCano
Enviado el: lunes, 02 de enero de 2017 01:10 a.m.
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] Re: validar si un archivo está abierto o en uso

 

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

Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.com

Versión: 2016.0.7924 / Base de datos de virus: 4739/13691 - Fecha de la versión: 02/01/2017

Euro Nava

unread,
Jan 2, 2017, 9:46:25 AM1/2/17
to publice...@googlegroups.com

Chicos funciono ¡perfecto!, con la corrección en =FCLOSE(m.nOpen) 

 

 

Gracias por el soporte exitos en este nuevo año

 

 

 

El presente correo y sus anexos son exclusivamente para el uso de los destinatarios indicados en el encabezado del mismo, pueden contener información confidencial y/o privilegiada. Si usted por error ha recibido la presente correspondencia agradezco hacer omisión de esta y hacerme del conocimiento por esta misma vía    

 

Bendito el Hombre que ha sido llamado por Cristo para ser el soldado del ejército en cuya mano empuñe como arma la palabra de Dios

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de HernanCano
Enviado el: lunes, 02 de enero de 2017 01:10 a.m.
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] Re: validar si un archivo está abierto o en uso

 

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

Fidel Charny

unread,
Jan 2, 2017, 10:39:47 AM1/2/17
to Comunidad de Visual Foxpro en Español
Hola Euronv
En tu código original hay dos errores:
1) If FOPEN( ) successfully opens the file, the file handle number of the file is returned. FOPEN( ) returns –1 if the file cannot be opened.
   Esto significa que la comprobación para nOpen debe hacerse con -1 y no con cero.

2) Fclose("pepe") no cerrará ningún archivo. El parámetro que requiere esa función es el handless del archivo. Fclose(nOpen)

Digo esto porque todavía no he visto que hayas corregido estos problemas.

Ah, ahora si veo que viste uno de los problemas.

Euro Nava

unread,
Jan 2, 2017, 12:33:56 PM1/2/17
to publice...@googlegroups.com

Gracias Fidel

 

 

Saludos

 

 

 

El presente correo y sus anexos son exclusivamente para el uso de los destinatarios indicados en el encabezado del mismo, pueden contener información confidencial y/o privilegiada. Si usted por error ha recibido la presente correspondencia agradezco hacer omisión de esta y hacerme del conocimiento por esta misma vía    

 

Bendito el Hombre que ha sido llamado por Cristo para ser el soldado del ejército en cuya mano empuñe como arma la palabra de Dios

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Fidel Charny


Enviado el: lunes, 02 de enero de 2017 11:40 a.m.
Para: Comunidad de Visual Foxpro en Español

HernanCano

unread,
Jan 2, 2017, 11:43:42 PM1/2/17
to Comunidad de Visual Foxpro en Español
Entonces tu problema es que tienes un ON ERROR que no muestra los errores correctos....

Chao.

Fidel Charny

unread,
Jan 3, 2017, 6:24:19 AM1/3/17
to Comunidad de Visual Foxpro en Español
Hernán:
Qué error mostraría?. Puedes poner FCLOSE(.T.), Fclose(.F.), Fclose("papa"). Lamentablemente VFP no advierte sobre el tipo de parámetro inválido en esta función. No genera ningún error atrapable. Simplemente no hace nada.

Ahora bien, lo correcto sería:
lClose = Fclose("algo")
Al testear lClose, su valor será .F. y ahí sabemos que hay algo que no está funcionando.

El error, en todo caso, sería que, ante un comportamiento inesperado de una función nativa, no repasemos la ayuda para ver si estamos haciendo lo correcto.
La ayuda propone: FCLOSE(nFileHandle), con lo que ya se puede advertir que el parámetro debe ser numérico y, además:
nFileHandle: Specifies the file handle of the low-level file to close. The numeric file handle is returned when you create the file with FCREATE( ) or open the file with FOPEN( ).
Reply all
Reply to author
Forward
0 new messages