Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Shell Notify o Monitoreo de archivos (https://www.clubdelphi.com/foros/showthread.php?t=75784)

juank1971 19-09-2011 16:41:41

Shell Notify o Monitoreo de archivos
 
Saludos Amigos:
Necesito me aclaren si conocen algun componente o algo que me ayude a monitoriar en windows la copia de una extensión determinada de ficheros.

He estado probando con ShelNotify de los TMS Components y los de JVCL, pero no logro encontrar el nombre del fichero que cambia, hasta ahora los eventos que he podido encontar me dan solo los cambios en directorios y no logro ver el nombre del fichero para verificar la extensión.

Solamente he podido hacrlo con un Componente llamado DirMon que si funciona y puedo ver el nombre de los ficheros renombrados o copiados pero cuando lleva un rato en el monitoreo y se hacen muchas operaciones a la vez se me bloquea la aplicacion.

Me puede dar una sujerencia, ya he buscado bastante en Google y no encuentro nada concreto a ficheros solo para cambios en directorios.

Gracias Juank

escafandra 19-09-2011 22:06:45

Te recomiendo la lectura de esto y esto. Puedes saber que "algo" cambia, en que carpeta, pero no que archivo. Mira el archivo mas moderno y a ver si tiene la extensión que quieres.

Otra forma puede ser con Hooks a las API correspondientes de apertura y creación de ficheros (OepnFile y CreateFile).

Saludos.

escafandra 19-09-2011 23:26:07

Me gustaría añadir algo a mi mensaje anterior. El segundo enlace está equivocado, me refería al truco titulado Monitorizando el Shell sólo con la API.

En ese truco publico y subo una pequeña aplicación de ejemplo que monitoriza las acciones en un Memo. Para el caso que pretendes, fíjate en esta parte del código:
Código Delphi [-]
procedure TForm1.WMShellChanged(var Msg: TMessage);
var
  i: integer;
  ppidl: PPITEMIDLIST;
  Path: array [0..MAX_PATH] of CHAR;
begin
  ppidl:= PPITEMIDLIST(Msg.WParam);
  SHGetPathFromIDList(ppidl^, Path);
  if Path[0] = #0 then exit;
  case Msg.LParam and $7FFFFFF of
    ...............................................
    SHCNE_CREATE:
       Memo1.Lines.Add('Archivo nuevo: ' + String(Path));
    SHCNE_DELETE:
       Memo1.Lines.Add('Archivo borrado: ' + String(Path));
    ...............................................
    SHCNE_RENAMEITEM:
    begin
       i:=1;
       lstrcat(Path, ' a ');
       SHGetPathFromIDList(PAPITEMIDLIST(ppidl)[i], Path + lstrlen(Path));
       Memo1.Lines.Add('Archivo renombrado: ' + String(Path));
    end;
    ...............................................
       Memo1.Lines.Add(Path);
  end;
end;

También dispones del código en C++Builder, no se que lenguaje estás usando.

Juega con el código. :)


Saludos.

juank1971 22-09-2011 04:05:06

Gracias
 
Gracias escafandra lo que no me funciona este
PPITEMIDLIST este tipo no encuentro a que unit pertenece, me da un error
estoy haciendo las pruebas en delphi xe.

salud y pesetas juank

gracias amigo eres muy preocupado por responder.

escafandra 22-09-2011 12:29:03

Cita:

Empezado por juank1971 (Mensaje 412952)
...PPITEMIDLIST este tipo no encuentro...

No está definido en delphi. usa esto:
Código Delphi [-]
type
  PPITEMIDLIST = ^PITEMIDLIST;
  APITEMIDLIST = array [0..0] of PITEMIDLIST;
  PAPITEMIDLIST = ^APITEMIDLIST;

Saludos.


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

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi