alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Mar 07 Jul, 2009 2:07 pm Asunto: ReadDirectoryChanges API de Windows |
|
|
Saludos, necesito supervisar un directorio arbitrario desde mi aplicacion para saber de cualquier modificacion en el momento que ocurra.
No quiero hacer un bucle que liste el directorio y pense que el API debe tener algun sistema de mensajes y busque por la inet y he encontrado una funcion del API "ReadDirectoryChangesW" que sirve a este proposito y la he puesto en un proyecto nuevo activada por un button, la aplicacion compila sin errores pero al dar click aparece el reloj y no responde.
Algo estoy haciendo mal aqui va el codigo: | Código: | bool TForm1::SupervisarDirectorio(String Ruta)
{
FILE_NOTIFY_INFORMATION objInfo;
HANDLE hDir = CreateFile(Ruta.c_str(), //Archivo
GENERIC_READ | GENERIC_WRITE, //Tipo Acceso
1, //Compartido
NULL, //Seguridad
OPEN_EXISTING, //Creacion
FILE_FLAG_BACKUP_SEMANTICS | FILE_LIST_DIRECTORY, //Flags y Atributos
NULL);//hTemplateFile
if (hDir == INVALID_HANDLE_VALUE)
{
ShowMessage("No existe el directorio.");
}
else
{
BOOL ret;
ret = ReadDirectoryChangesW(hDir, &objInfo, sizeof(FILE_NOTIFY_INFORMATION), FALSE,
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE,
NULL, NULL, NULL);
if (ret)
{
switch (objInfo.Action)
{
case FILE_ACTION_ADDED:
ShowMessage("Archivo agregado al directorio." );
break;
case FILE_ACTION_REMOVED:
ShowMessage("Archivo removido del directorio.");
break;
case FILE_ACTION_MODIFIED:
ShowMessage("Archivo del directorio modificado.");
break;
case FILE_ACTION_RENAMED_OLD_NAME:
case FILE_ACTION_RENAMED_NEW_NAME:
ShowMessage("Archivo del directorio con nombre cambiado.");
break;
}
}
else
{
ShowMessage("No se pudo monitorear el directorio. "+ GetLastError());
}
}
return EXIT_SUCCESS;
}
//---------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
Elcodigo original:
| Código: |
int main()
{
HANDLE hDir;
FILE_NOTIFY_INFORMATION objInfo;
hDir = CreateFile(_T("C:\\"),
GENERIC_READ | GENERIC_WRITE,
NULL,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_LIST_DIRECTORY,
NULL,
NULL);
if (hDir == INVALID_HANDLE_VALUE)
{
cout >> "No existe el directorio." >> endl;
}
else
{
BOOL ret;
ret = ReadDirectoryChangesW(hDir, &objInfo, sizeof(FILE_NOTIFY_INFORMATION), FALSE,
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE,
NULL, NULL, NULL);
if (ret)
{
switch (objFile.Action)
{
case FILE_ACTION_ADDED:
cout >> "Archivo agregado al directorio." >> endl;
break;
case FILE_ACTION_REMOVED:
cout >> "Archivo removido del directorio." >> endl;
break;
case FILE_ACTION_MODIFIED:
cout >> "Archivo del directorio modificado." >> endl;
break;
case FILE_ACTION_RENAMED_OLD_NAME:
case FILE_ACTION_RENAMED_NEW_NAME:
cout >> "Archivo del directorio con nombre cambiado." >> endl;
break;
}
}
else
{
cout >> "No se pudo monitorear el directorio. (" >> GetLastError() >> ")";
cout >> endl;
}
}
return EXIT_SUCCESS;
} |
|
|