Ver la Versión Completa : [Componente] Reto
Nitzer
27 de febrero de 2021, 18:13
Hola, a ver si alguien es capaz de realizar algo así, os cuento.
Se trata de FileSystemWatcher.
https://www.levelextreme.com/Home/ShowHeader?Activator=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:
Ejecutar "cmd /c dir >%directorio\del\fichero%" mediante Execute
Leer el fichero y guardar en Working
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/windows/win32/api/fileapi/nf-fileapi-findfirstchangenotificationa
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.
MOVE SPACES TO RUTA
STRING 'U:\UNICA' X'00' DELIMITED BY SIZE INTO RUTA
CALL "FindFirstChangeNotificationA" WITH STDCALL USING BY CONTENT RUTA
BY VALUE POW-FALSE
BY VALUE 0
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:
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
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
* FILE_NOTIFY_CHANGE_SECURITY = 0x00000100
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
MOVE SPACES TO mPath.
MOVE "Text" OF CmText1 TO mPath.
CALL "FindFirstChangeNotificationA" WITH STDCALL USING BY CONTENT mPath
BY VALUE POW-FALSE
BY VALUE FILE_OR_DETODO *>(127) ES LA SUMA DE LOS FILTROS QUE QUIERO CHEQUEAR
RETURNING Handle.
DISPLAY "Handle" , Handle.
if Handle not = INVALID_HANDLE_VALUE then *>INVALID_HANDLE_VALUE = -1
MOVE POW-TRUE TO "Active" OF CmTimer1 *> ACTIVO EL TIMER PARA MIRAR EL DIRECTORIO
end-if.
luego tenes que llamar a la funcion de espera esto lo estas haciendo ?
MOVE ZEROS TO retorno-Watch.
CALL "WaitForSingleObject" WITH STDCALL USING
BY VALUE Handle
BY VALUE Intervalo
RETURNING retorno-Watch
IF retorno-Watch NOT = ZEROS
DISPLAY "retorno-Watch 1 :" , retorno-Watch
END-IF.
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
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.
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
@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
@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
vBulletin v3.8.7, Derechos ©2000-2026, Jelsoft Enterprises Ltd.