(Co-Admin)
Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
Turbo Delphi für Win32
|
Überprüfen, ob Dateien/Verzeichnisse gerade benutzt werden
17. Apr 2006, 22:15
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]
|
|
Zitat
|