Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Componente] Reto (https://www.cobolforo.es/showthread.php?t=1268)

Nitzer 27 de febrero de 2021 18:13

Reto
 
Hola, a ver si alguien es capaz de realizar algo así, os cuento.

Se trata de FileSystemWatcher.

https://www.levelextreme.com/Home/Sh...or=23&ID=38881

Se trata de averiguar cuando algo en la carpeta seleccionada cambia.
Lo quiero implementar para poder detectar en tiempo real si hay un cambio en alguna DLL y que avise al usuario de que tiene que actualizar.

Espero haberme explicado bien :)

Hay bastante información en Internet, pero no se como implementarlo, igual lo mejor es hacer un ocx. A ver si se os ocurre algo :)

Gracias.

Kuk 28 de febrero de 2021 11:09

@Nitzer, mi proposición:
  1. Ejecutar "cmd /c dir >%directorio\del\fichero%" mediante Execute
  2. Leer el fichero y guardar en Working
  3. Las lecturas siguientes, comparar con lo que hay en working

Hacerlo en un Timer, cada minuto o algo así, para no hacer demasiadas I/O

Nitzer 28 de febrero de 2021 15:39

@kuk, esa solución siempre está presente, pero la idea es hacer algo que en otros lenguajes es relativamente sencillo :).
Lo he probado en Visual Basic y funciona perfectamente, hay varios ejemplos en internet.
Pero no se como implementarlo en Cobol.

fastpho 28 de febrero de 2021 16:04

Buenas @Nitzer, estuve leyendo un poco del tema de monitoreo de carpetas es mas facil en otros lenguajes como vb como comentas, pero podrias probar hacer llamadas cada cierto tiempo a la función FindFirstChangeNotificationA de libreria kernel32 que se puede llamar desde pwc ....

https://docs.microsoft.com/en-us/win...enotificationa
Saludos

Nitzer 28 de febrero de 2021 17:50

Pues Fastpho he estado probando, pero no consigo el resultado :(

he incluido este código, según he visto por Internet como usar la Api.
Código COBOL:
  1.      MOVE SPACES TO RUTA
  2.      STRING 'U:\UNICA' X'00' DELIMITED BY SIZE INTO RUTA
  3.     CALL "FindFirstChangeNotificationA" WITH STDCALL USING BY CONTENT RUTA
  4.                                                        BY VALUE POW-FALSE
  5.                                                        BY VALUE 0
  6.                                                        RETURNING RETORNO

fastpho 28 de febrero de 2021 18:35

Nitzer estoy mirando desde el celular ,me parece q el flag 0 esta mal y empezaria por leer una carpeta del disco local para saber si funciona,no se funcionara con disco de red, que valor tes esta retornando ?

Kuk 28 de febrero de 2021 22:32

@Nitzer, el BY VALUE 0 no lo puede ser, como dice @fastpho.

Tienes que elegir uno de los siguientes valores:

Cita:

Citación del post de Microsoft

FILE_NOTIFY_CHANGE_FILE_NAME
0x00000001

Any file name change in the watched directory or subtree causes a change notification wait operation to return. Changes include renaming, creating, or deleting a file name.

FILE_NOTIFY_CHANGE_DIR_NAME
0x00000002

Any directory-name change in the watched directory or subtree causes a change notification wait operation to return. Changes include creating or deleting a directory.

FILE_NOTIFY_CHANGE_ATTRIBUTES
0x00000004

Any attribute change in the watched directory or subtree causes a change notification wait operation to return.

FILE_NOTIFY_CHANGE_SIZE
0x00000008

Any file-size change in the watched directory or subtree causes a change notification wait operation to return. The operating system detects a change in file size only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.

FILE_NOTIFY_CHANGE_LAST_WRITE
0x00000010

Any change to the last write-time of files in the watched directory or subtree causes a change notification wait operation to return. The operating system detects a change to the last write-time only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.

FILE_NOTIFY_CHANGE_SECURITY
0x00000100

Any security-descriptor change in the watched directory or subtree causes a change notification wait operation to return.


Nitzer 28 de febrero de 2021 23:13

@Kuk, U: es una carpeta local, le llamo U de Unica :)

Ya vi los valores, pero como le paso el primero por ejemplo 0X0000001 , no tengo ni idea.

fastpho 1 de marzo de 2021 13:44

@Nitzer, los flags son los filtros o eventos que queres monitorear , los valores serian
Código:

FILE_NOTIFY_CHANGE_FILE_NAME = H1 'decimal 1
 FILE_NOTIFY_CHANGE_DIR_NAME = H2 'decimal 2
 FILE_NOTIFY_CHANGE_ATTRIBUTES = H4 'decimal 4
 FILE_NOTIFY_CHANGE_SIZE = H8 'decimal 8
 FILE_NOTIFY_CHANGE_LAST_WRITE = H10 'decimal 16
 FILE_NOTIFY_CHANGE_LAST_ACCESS = H20 ' decimal 32
 FILE_NOTIFY_CHANGE_CREATION = H40  'decimal 64


Kuk 1 de marzo de 2021 14:41

@Nitzer, lo que empieza por 0x es en Hexadecimal. Con lo cual, sería

Código COBOL:
  1. * FILE_NOTIFY_CHANGE_SECURITY = 0x00000100
  2.  01 FILE_NOTIFY_CHANGE_SECURITY PIC S9(9) COMP-5 VALUE H"00000100".

Nitzer 1 de marzo de 2021 19:04

@KUK, pues no tengo narices.
lo que he notado es que el retorno me suma 4 cada vez que le doy al botón donde he puesto el código.
Pero no consigo lo que yo quiero :(

fastpho 2 de marzo de 2021 13:31

@Nitzer, Esta bien que te un valor distinto el retorno de la funcion te paso un ejemplo
Código COBOL:
  1.  
  2.      MOVE SPACES TO mPath.
  3.      MOVE "Text" OF CmText1 TO  mPath.
  4.      CALL "FindFirstChangeNotificationA" WITH STDCALL USING BY CONTENT mPath
  5.                                                             BY VALUE POW-FALSE
  6.                                                             BY VALUE FILE_OR_DETODO *>(127) ES LA SUMA DE LOS FILTROS QUE QUIERO CHEQUEAR
  7.                                                             RETURNING Handle.
  8.       DISPLAY "Handle" , Handle.
  9.        if Handle not = INVALID_HANDLE_VALUE then *>INVALID_HANDLE_VALUE = -1
  10.           MOVE POW-TRUE TO "Active" OF CmTimer1 *> ACTIVO EL TIMER PARA MIRAR EL DIRECTORIO
  11.          
  12.        end-if.          
luego tenes que llamar a la funcion de espera esto lo estas haciendo ?
Código COBOL:
  1.     MOVE ZEROS TO retorno-Watch.
  2.  
  3.      CALL "WaitForSingleObject" WITH STDCALL USING
  4.                                BY VALUE Handle
  5.                                BY VALUE Intervalo
  6.                                RETURNING retorno-Watch
  7.  
  8.      IF retorno-Watch NOT = ZEROS
  9.         DISPLAY "retorno-Watch 1 :" , retorno-Watch
  10.      END-IF.      
  11.      
Una vez satisfecha la espera, la aplicación puede responder a esta condición y continuar monitoreando el directorio llamando a la función FindNextChangeNotification y la función de espera correspondiente. Cuando el identificador ya no es necesario, se puede cerrar mediante la función FindCloseChangeNotification .

Nitzer 2 de marzo de 2021 18:23

Gracias a todos, pero al final voy a tirar por el método mas sencillo y sin lios :))).

Al abrir cada formulario le hago un 'CBL_CHECK_FILE_EXIST2' y guardo sus valores iniciales.
Luego coloco un timer cada 5 minutos que lo vuelva a hacer y compare con el valor inicial, si es diferente ya se que se ha modificado la DLL y le informo al usuario que se actualice :)

Lo que no se es si puedo saber desde un formulario en que DLL se encuentra, no he encontrado información al respecto, no se si existe esa posibilidad, aunque tampoco he podido encontrar como el form sabe como se llama, es decir no he encontrado una propiedad como Name del formulario.

Kuk 3 de marzo de 2021 00:19

1 Archivos Adjunto(s)
Cita:

Citación del post de Nitzer (Mensaje 6500)
Al abrir cada formulario le hago un 'CBL_CHECK_FILE_EXIST2'

Joe, se nota que llevo tiempo sin tocarlo. Ni me acordaba de que efectivamente esa rutina te devuelve información sobre el fichero.

Cita:

Citación del post de Nitzer (Mensaje 6500)
Lo que no se es si puedo saber desde un formulario en que DLL se encuentra

Habrá que investigar las propiedades ocultas del Form. Sé que en el binario el nombre del Form sigue existiendo. Y también me acuerdo que a diferencia del resto de controles, el Form reside en un fichero DLL y no OCX. Pero no me acuerdo en cuál.

Te voy a pasar una herramienta muy útil que te va a encantar, sobre todo el "Generate" :cerv:

Nitzer 3 de marzo de 2021 08:08

Interesante herramienta kuk :) Ya podían haber hecho la pantalla algo mas grande :)))

A ver si encontramos donde están las propiedades ocultas del form, que seguro que las tiene. Gracias por el aporte.

Kuk 3 de marzo de 2021 10:41

@Nitzer, pincha en View luego en Generate y mira el contenido, ya verás ;)

Nitzer 3 de marzo de 2021 12:58

Cita:

Citación del post de Kuk (Mensaje 6505)
@Nitzer, pincha en View luego en Generate y mira el contenido, ya verás ;)

SI :) lo hice, es interesante, pero no debo desviarme, que como me meta con estas "cosillas" pierdo el norte :) y ganas no me faltan.
Siempre digo que aprovechamos del Netcobol solo una pequeña parte.

fastpho 12 de marzo de 2021 19:44

reto monitoreo
 
1 Archivos Adjunto(s)
@Nitzer , Me quede con las ganas con tu reto , para monitorear tu carpeta, y meti algunas lineas para ver que se puede hacer y me avisa cualquier cambio que produzca en la carpeta que se esta monitoreando, al borrar modificar o crear cualquier archivo , no logre todavia cual archivo
Saludos


La franja horaria es GMT +2. Ahora son las 17:06.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.