Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-05-2010
CHRISTIANHAZ77 CHRISTIANHAZ77 is offline
Registrado
 
Registrado: mar 2010
Posts: 8
Poder: 0
CHRISTIANHAZ77 Va por buen camino
Saber cuando se crea un archivo nuevo en un directorio

Hola, queria consultar si alguien sabe, o se puede detectar, si se produce la creacion de un archivo nuevo dentro de un directorio x. Necesito saber esto ya que mi aplicacion debe tomar informacion de otro soft luego que este la crea.
Gracias
Responder Con Cita
  #2  
Antiguo 30-05-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Puedes convertir a tu aplicación en una extensión del Shell, para elle debes ser capaz de recibir el mensaje WM_SETTINGCHANGE que se envía al Shell y sus extensiones al producirse cambios. Esas notificaciones se envían mediante la API
SHChangeNotify. En tu caso debes controlar el valor SHCNE_CREATE:

Código:
typedef ULONG(WINAPI *PSHChangeNotifyRegister)(HWND hwnd, int fSources, LONG fEvents, UINT wMsg,
                                     int cEntries, const SHChangeNotifyEntry *pshcne);

typedef BOOL (WINAPI *PSHChangeNotifyDeregister)(ULONG ulID);

// Convertir el formulario en receptor del mensaje WM_SETTINGCHANGE
void __fastcall TForm1::StartNotification()
{
    PSHChangeNotifyRegister SHChangeNotifyRegister =
           (PSHChangeNotifyRegister)GetProcAddress(GetModuleHandle("shell32.dll"), "SHChangeNotifyRegister");

    SHChangeNotifyEntry shCNE;
    shCNE.pidl = 0;
    shCNE.fRecursive = TRUE;

    // Eventos que se van a registrar
    LONG Events =  SHCNE_CREATE |SHCNE_DELETE;

    m_ulSHChangeNotifyRegister = SHChangeNotifyRegister(Handle, SHCNRF_INTERRUPT_LEVEL | SHCNRF_SHELL_LEVEL, Events, WM_USER_SHELLCHANGED, 1, &shCNE);
}


//-------------------------------------------------------------------------
// Responder al mensaje
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
   if(Message.Msg == WM_USER_SHELLCHANGED){
     switch(Message.LParam & 0x7FFFFFF)
     {
       case SHCNE_CREATE:
         // tu código dr creación de fichero
         break;
       case SHCNE_DELETE:
         // tu código de destrucción de fichero
         break;
     }
   }
   TForm::WndProc(Message);
}

// Destructor del Form Eliminarnos como extensión del Shell:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    PSHChangeNotifyDeregister SHChangeNotifyDeregister =
      (PSHChangeNotifyDeregister)GetProcAddress(GetModuleHandle("shell32.dll"), "SHChangeNotifyDeregister");

    if(m_ulSHChangeNotifyRegister)
      SHChangeNotifyDeregister(m_ulSHChangeNotifyRegister);

}

Saludos.
Responder Con Cita
  #3  
Antiguo 30-05-2010
CHRISTIANHAZ77 CHRISTIANHAZ77 is offline
Registrado
 
Registrado: mar 2010
Posts: 8
Poder: 0
CHRISTIANHAZ77 Va por buen camino
gracias

Agradezco mucho tu tiempo, almenos se que se puede, no entiendo a simple vista ese codigo pero le voy a dedicar tiempo para tratar de descifrarlo, para que el TFORM pueda recibir o captar esos cambios en donde debe ir el codigo?
Responder Con Cita
  #4  
Antiguo 30-05-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
En primer lugar decirte que el ejemplo está escrito en C++ Builder, pero es fácilmente trasladable a delphi si es el lenguaje que usas. En segundo lugar, para que tu código sea sensible a WM_SETTINGCHANGE, es decir que reciba ese mensaje junto con el Shell, debes ejecutar el código de la función StartNotification que como ves la he escrito como miembro de Form1. Cuando quieras dejar de de recibir el mensaje WM_SETTINGCHANGE debes ejecutar FormDestroy esto lo puedes hacer cuando quieras dejar de recibir el mensaje o al destruir el form1.

El Resto es la rutina de tratamiento del mensaje, que tendrás que diseñar tu.

Saludos.
Responder Con Cita
  #5  
Antiguo 31-05-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
También puede utilizar algun componente que encapsula estecomportamiento y que te será más sencillo de utilizar. Las RxLib, por ejemplo, traen uno llamado RxFolderMonitor, aunque seguro que en Torry puedes encontrar alguno más...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 31-05-2010
Avatar de Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Poder: 19
Faust Va por buen camino
Precisamente es algo que estaba a punto de preguntar, pero no me atrevía, pues no había buscado en el foro...

He descargado algunos componentes de torry y creo de delphi about, pero no me satisfacen, pues notifican p. ej. cuando se crea un archivo haciendo clic derecho en el explorador de windows clic en el submenu nuevo y archivo de texto, pero cuando algunos programas crean el archivo, p. ej. al darle guardar como, no lo notifica ...

¿cuál sería un método efectivo para realizar esta tarea?
__________________
Herr Heins Faust
Responder Con Cita
  #7  
Antiguo 01-06-2010
CHRISTIANHAZ77 CHRISTIANHAZ77 is offline
Registrado
 
Registrado: mar 2010
Posts: 8
Poder: 0
CHRISTIANHAZ77 Va por buen camino
Muchas Gracias!

Agradezco a todos por la ayuda, es dificil iniciar preguntando algo, pero la verdad solucione lo que necesitaba, son casi los primeros pasos que doy en programacion, pero en un futuro no muy lejano seguro estare de su lado tambien colaborando. gracias
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Evento cuando se crea un componente sobre el mio delphiladero OOP 1 17-06-2008 12:51:10
Donde y cuando se crea el PDOXUSRS.LCK? elcigarra Conexión con bases de datos 6 03-01-2006 17:07:16
saber si es directorio o archivo rob1 Varios 6 16-12-2005 05:08:27
Saber si es directorio o archivo. DarkByte API de Windows 2 24-10-2004 15:59:24
Al pulsar tab en grid, no tabula, y crea nuevo registro. setry2 OOP 2 31-05-2003 23:14:57


La franja horaria es GMT +2. Ahora son las 19:10:20.


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
Copyright 1996-2007 Club Delphi