Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Dateien / Laufwerke (https://www.delphipraxis.net/41-library-dateien-laufwerke/)
-   -   Delphi Überprüfen, ob Dateien/Verzeichnisse gerade benutzt werden (https://www.delphipraxis.net/67631-ueberpruefen-ob-dateien-verzeichnisse-gerade-benutzt-werden.html)

Matze 17. Apr 2006 21:15


Überprüfen, ob Dateien/Verzeichnisse gerade benutzt werden
 
Sind Dateien beispielsweise exklusiv geöffnet, lassen sich diese zum Beispiel nicht umbenennen oder löschen.

Folgende Sourcen ermöglichen das Abfragen, ob eine Datei/ ein Ordner in Verwendung sind.

Der Source wurde von sh17 hier gepostet.

Delphi-Quellcode:
function IsFileInUse(const FileName: String): Boolean;
var
  HFileRes : HFILE;
begin
  Result := false;
  if not FileExists(FileName) then exit;
  HFileRes := CreateFile(PChar(FileName), GENERIC_READ,
    0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then CloseHandle(HFileRes);
end;
Und dieser wurde von Delphi-Freak hier gepostet.

Delphi-Quellcode:
function IsDirInUse(const FileName: String): Boolean;
var
  HFileRes: HFILE;
begin
  Result := False;
  if not DirectoryExists(FileName) then Exit;
  HFileRes := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
    0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_BACKUP_SEMANTICS, 0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then CloseHandle(HFileRes);
end;

himitsu stellt noch zwei weitere Möglichkeiten vor, mit denen man noch "ein paar Prozessortakte einsparen" kann:

Delphi-Quellcode:
// PChar > Pointer = kein Aufruf von System.LStrToPChar
function IsFileInUse(const FileName: String): Boolean;
var
  h: THandle;
begin
  h := CreateFile(Pointer(FileName), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  Result := h = INVALID_HANDLE_VALUE;
  CloseHandle(h);
end;



// und hier noch die letzten 4-5 Prozessortackte gesparrt
function IsFileInUse(const FileName: String): Boolean;
asm
  push ebx
  push 0
  push 0
  push OPEN_EXISTING
  push 0{nil}
  push 0
  push GENERIC_READ
  push &FileName
  call CreateFile
  cmp eax, INVALID_HANDLE_VALUE
  setz bl
  push eax
  call CloseHandle
  mov al, bl // al = &Result
  pop ebx
end;

[edit=fkerber]Neuen Code eingefügt. Mfg, fkerber[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz