AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IsFileInUse mit CreateFile

Ein Thema von omp · begonnen am 3. Nov 2017 · letzter Beitrag vom 3. Nov 2017
Antwort Antwort
omp

Registriert seit: 7. Apr 2012
62 Beiträge
 
#1

IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 11:35
Hallo. Um zu prüfen, ob eine Datei geöffnet ist, verwendet man gerne
Code:
function IsFileInUse(const AFileName: string; ANeedWriteAccess: boolean): boolean;
var LFileRes: HFILE;
    LAccess : DWord;
begin
  if ANeedWriteAccess then
    LAccess := GENERIC_READ or GENERIC_WRITE
  else
    LAccess := GENERIC_READ;
  LFileRes := CreateFile(pchar(AFileName),
                         LAccess, 0, nil,
                         OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
  result := (LFileRes = INVALID_HANDLE_VALUE);
  if not result then
    CloseHandle(LFileRes);
end;
Der Code wird in diversen Foren und auf Tipp-Seite genannt und er funktionierte auch seit Jahren, dachte ich.

Als Win32-Application ist alles ok.

Als Win64 kompiliert und die .exe ausgeführt: Es wird nicht erkannt, dass die Datei geöffnet ist. Es gibt keine Exception.

Als Win64 im Delphi-Debugger ausgeführt verhält dich das Programm anders:
1. "Im Projekt .. ist eine Exception der Klasse $C0000008 mit der Meldung 'c0000008 INVALID_HANDLE' aufgetreten."
2. Dann die Fehlermeldung im Programm "Externe Exception C0000008". Diese kommt aber nicht, wenn ohne Debugger ausgeführt.
Tritt bei CloseHandle auf. LFileRes ist ein großer Integerwert, also <> INVALID_HANDLE_VALUE.

Habe auch ein neues Delphi-Projekt (10.2 Tokyo) angelegt und konnte es auch damit nachvollziehen.

Jetzt habe ich ein Fragezeichen auf dem Kopf.
Harald
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 12:06
Ersetze mal HFILE durch THandle (der eigentliche Rückgabetyp von CreateFile). HFILE ist nur 32-Bit groß, THandle 64-Bit.

HFILE gehört zu OpenFile() und das stammt aus der 16-Bit Windows Welt.

Geändert von jbg ( 3. Nov 2017 um 12:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 12:50
Und Exceptions gibt es hier standardmäßig auch keine.
Darum wird bei solchen Funktionen auch gern auf einen Ressourcenschutzblock verzichtet. (Try-Finally)

Willst du wirklich Gründe für das nichtfunktionieren wissen, muß due die Results und GetLastError bei den WinAPIs (CreateFile und CloseHandle) auswerten.
Da wäre dann auch aufgefallen, wenn die Hälfte vom Wert "INVALID_HANDLE_VALUE" aka HANDLE(-1) fehlt.

Windows HANDLE = Delphi THandle
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
omp

Registriert seit: 7. Apr 2012
62 Beiträge
 
#4

AW: IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 12:51
Ersetze mal HFILE durch THandle
Einfach. Schnell. Kompetent.
Danke Dir.
Harald
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#5

AW: IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 12:52
Probier es mal so. Sollte funktionieren. Wurde bei Google zusammengesucht

Delphi-Quellcode:

{$IFDEF WIN32}

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
 pop ebx
end;

{$ELSE}

function IsFileInUse(const FileName: string): Boolean;
var
 h: THandle;
begin
 h := CreateFile(PChar(FileName), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Result := h = INVALID_HANDLE_VALUE;
 CloseHandle(h);
end;

{$ENDIF}
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 13:48
Und das funktioniert auch wenn der Frager keine Leserechte besitzt?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#7

AW: IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 13:55
Hab ich nicht getestet, keine Ahnung.
Aber wenn man keine Leserechte hat, ist doch eh Hopfen und Malz verloren oder nicht?

Für das simple Auslesen sollte es aber reichen.
  Mit Zitat antworten Zitat
omp

Registriert seit: 7. Apr 2012
62 Beiträge
 
#8

AW: IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 14:01
Danke für die Hinweise. Mein Fehler lag an HFILE. Das geht unter Win64 nicht mehr. Also bitte THandle verwenden.

Und das funktioniert auch wenn der Frager keine Leserechte besitzt?
Tatsächlich gibt es bei der Prüfung noch einiges zu beachten. Beispielsweise beim Aufruf mit ANeedWriteAccess:
CreateFile mit "GENERIC_READ or GENERIC_WRITE" scheitert auch, wenn das ReadOnly-Attribut gesetzt ist.

Gruß und Dank.
Harald
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 16:21
Solche Funktionen sind ehrlich gesagt fast immer Schwachsinn (ähnlich wie vor bestimmten Aktionen zu prüfen, ob der Benutzer Adminrechte besitzt). Die Problematik mit den Zugriffsrechten wurde ja schon genannt. Warum nicht einfach zu dem Zeitpunkt, an dem man versucht die Datei zu öffnen auf entsprechende Fehler reagieren?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 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