PDA

Ver la Versión Completa : Borrar archivos de un directorio


nelem
29-10-2007, 09:01:45
Buenos días a ver si podeis ayudarme estoy intentando borrar un archivo pdf cuando el usuario le cierre pero no se si esto se puede hacer porque no veo la manera de saber cuando el usuario me cierra el pdf. Otra opcion seria ir recorriendo un directorio y el archivo que no este abierto borrarlo pero tampoco se como puedo saber si un archivo esta en uso o no.


Muchas gracias por su ayuda

Neftali [Germán.Estévez]
29-10-2007, 10:58:47
Creo que no hay otra opción que ir haciendo un "pooling" sobre el fichero a ver si está abierto.
A no ser que lo hayas abierto tú desde programa.

nelem
29-10-2007, 12:16:07
Creo que no hay otra opción que ir haciendo un "pooling" sobre el fichero a ver si está abierto.
A no ser que lo hayas abierto tú desde programa.

Hola los archivos les guardo yo en disco y les abro. Pero no se como puedo saber el momento que me le cierran.

Neftali [Germán.Estévez]
29-10-2007, 12:44:49
¿Puedes explicar cómo los abres? ¿Desde el programa?
De todas formas, creo que algun sistema de pooling no te lo quita nadie.

nelem
29-10-2007, 13:41:26
A ver te escribo el codigo donde ruta contiene la ruta del pdf

ShellExecute(GetDesktopWindow(),nil, PChar(Ruta),
nil, nil, SW_SHOWNORMAL);
PathAplicacion := BuscaExecutable('pdf');
EjecutaAplicacion(PathAplicacion);


function EjecutaAplicacion(prmNombreArchivo :string):Boolean;
var Retorno :Integer;
begin
Retorno := ShellExecute(Application.Handle, 'open', PChar(prmNombreArchivo), nil, nil, SW_SHOWNORMAL);
Result := True;
case Retorno of
0 :begin
MessageDlg('El sistema operativo no tiene recursos sufcientes para esta operación.', mtInformation, [mbOK], 0);
Result := False;
end;
ERROR_FILE_NOT_FOUND :begin
MessageDlg('No se ha encontrado el archivo especificado.', mtInformation, [mbOK], 0);
Result := False;
end;
ERROR_PATH_NOT_FOUND :begin
MessageDlg('No se ha encontrado el archivo especificado.', mtInformation, [mbOK], 0);
Result := False;
end;
ERROR_BAD_FORMAT :begin
MessageDlg('El ejecutable no es una aplicación válida para Win32.', mtInformation, [mbOK], 0);
Result := False;
end;
SE_ERR_ACCESSDENIED :begin
MessageDlg('El sistema operativo ha denegado el acceso al archivo indicado.', mtInformation, [mbOK], 0);
Result := False;
end;
SE_ERR_ASSOCINCOMPLETE :begin
MessageDlg('La asociación del archivo es incompleta o no válida.', mtInformation, [mbOK], 0);
Result := False;
end;
SE_ERR_DDEBUSY, SE_ERR_DDEFAIL, SE_ERR_DDETIMEOUT :begin
MessageDlg('The DDE transaction failed.', mtInformation, [mbOK], 0);
Result := False;
end;
SE_ERR_DLLNOTFOUND :begin
MessageDlg('La biblioteca dinámica no ha sido encontrada.', mtInformation, [mbOK], 0);
Result := False;
end;
SE_ERR_NOASSOC :begin
MessageDlg('There is no application associated with the given filename extension.', mtInformation, [mbOK], 0);
Result := False;
end;
SE_ERR_OOM :begin
MessageDlg('There was not enough memory to complete the operation.', mtInformation, [mbOK], 0);
Result := False;
end;
SE_ERR_SHARE :begin
MessageDlg('A sharing violation occurred.', mtInformation, [mbOK], 0);
Result := False;
end;
end;
end;

Neftali [Germán.Estévez]
29-10-2007, 14:07:48
Ok. Gracias.
Si ejecutas con Shellexecute y todo ha ido bien, esa función te devuelve (si no recuerdo mal) un apuntador (Handle) de la ventana que ha abierto.
Con ese Handle podrías hecer un "poooling" cada x tiempo para ver si esa ventana sigue abierta.

De todas formas, no se si es complicar mucho la vida, porque eso tampoco te asegura que deje de estar bloqueado ese fichero.
Tal vez lo más seguro sea un pooling en disco cada cierto tiempo (utilizando un timer) aunque eso puede ser muy lento a veces.

nelem
29-10-2007, 16:04:00
Ok muchas gracias por tu ayuda voy a probar a ver si consigo hacer algo.