Ir al contenido


Foto

¿Cómo verificar si un archivo está en uso?


  • Por favor identifícate para responder
3 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 septiembre 2009 - 09:54

Pues eso, dejo esta función que verifica si algún archivo está en uso por otra aplicación o no:



delphi
  1. function IsFileInUse(fName : string) : boolean;
  2. var
  3.   HFileRes : HFILE;
  4.   Res: string[6];
  5.  
  6.   function CheckAttributes(FileNam: string; CheckAttr: string): Boolean;
  7.   var
  8.     fa: Integer;
  9.   begin
  10.     fa := GetFileAttributes(PChar(FileNam)) ;
  11.     Res := '';
  12.  
  13.     if (fa and FILE_ATTRIBUTE_NORMAL) <> 0 then
  14.     begin
  15.       Result := False;
  16.       Exit;
  17.     end;
  18.  
  19.     if (fa and FILE_ATTRIBUTE_ARCHIVE) <> 0 then
  20. Res := Res + 'A';
  21.     if (fa and FILE_ATTRIBUTE_COMPRESSED) <> 0 then
  22. Res := Res + 'C';
  23.     if (fa and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
  24. Res := Res + 'D';
  25.     if (fa and FILE_ATTRIBUTE_HIDDEN) <> 0 then
  26. Res := Res + 'H';
  27.     if (fa and FILE_ATTRIBUTE_READONLY) <> 0 then
  28. Res := Res + 'R';
  29.     if (fa and FILE_ATTRIBUTE_SYSTEM) <> 0 then
  30. Res := Res + 'S';
  31.  
  32.     Result := AnsiContainsText(Res, CheckAttr) ;
  33.   end; (*CheckAttributes*)
  34.  
  35.   procedure SetAttr(fName: string) ;
  36.   var
  37.     Attr: Integer;
  38.   begin
  39.     Attr := 0;
  40.     if AnsiContainsText(Res, 'A') then
  41. Attr := Attr + FILE_ATTRIBUTE_ARCHIVE;
  42.     if AnsiContainsText(Res, 'C') then
  43. Attr := Attr + FILE_ATTRIBUTE_COMPRESSED;
  44.     if AnsiContainsText(Res, 'D') then
  45. Attr := Attr + FILE_ATTRIBUTE_DIRECTORY;
  46.     if AnsiContainsText(Res, 'H') then
  47. Attr := Attr + FILE_ATTRIBUTE_HIDDEN;
  48.     if AnsiContainsText(Res, 'S') then
  49. Attr := Attr + FILE_ATTRIBUTE_SYSTEM;
  50.  
  51.     SetFileAttributes(PChar(fName), Attr) ;
  52.   end; (*SetAttr*)
  53. begin //IsFileInUse
  54.   if CheckAttributes(fName, 'R') then
  55.   begin
  56.   Result := False;
  57.  
  58.   if not FileExists(fName) then exit;
  59.  
  60.     if MessageDlg(ExtractFileName(fName) + ' is a READ-ONLY file.' + #13#10 + 'Do you wish to clear the READ-ONLY flag???', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
  61.     begin
  62.       Result := True;
  63.       Exit;
  64.     end;
  65.   end;
  66.  
  67.   SetFileAttributes(PChar(fName), FILE_ATTRIBUTE_NORMAL) ;
  68.  
  69.   SetAttr(fName) ;
  70.  
  71.   HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
  72.   Result := (HFileRes = INVALID_HANDLE_VALUE) ;
  73.   if not Result then CloseHandle(HFileRes) ;
  74. end; //IsFileInUse



Su modo de uso sería la siguiente:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var Estado: Boolean;
  3. begin
  4.   Estado := IsFileInUse('C:\descarga.html');
  5.   case Estado of
  6.     False : ShowMessage('no está en uso!');
  7.     True : ShowMessage('está en uso!');
  8.   end;
  9. end;



Probado en Delphi 7, que lo disfruten.

Saludos.
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 18 septiembre 2009 - 10:33

Buena aportación Fer !

Gracias  :)

Saludox !  :D
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 septiembre 2009 - 08:09

Qué bueno que te agrade Fena :), a ver qué dicen los demás.

Saludos.
  • 0

#4 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 19 septiembre 2009 - 09:18

Hola
Muy bueno amigo, muy bueno. (y)
Saludos
  • 0




IP.Board spam blocked by CleanTalk.