Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi IsFileInUse ergibt immer "false" (https://www.delphipraxis.net/170572-isfileinuse-ergibt-immer-false.html)

Maya 24. Sep 2012 12:44

Delphi-Version: 2010

IsFileInUse ergibt immer "false"
 
Hallo ihr Lieben,

bei meinen aktuellen Projekt möchte ich ja CSV-Dateien in eine Datenbank einlesen. Klappt ja alles, aber ich möchte nun vorher abfragen, ob die Datei schon geöffnet ist oder nicht. Also gegoogelt und bin auf die Funktion Ist eine Datei in Benutzung vom Delphi-Treff gestoßen. Das Einpflegen war ja nicht das Prob, aber nun zeigt er bei mir generell an, dass die Datei nicht in Benutzung ist. Problem an der Sache ist ja natürlich, wenn die Datei im Hintergrund aber geöffnet ist, z.B. per Excel, beim Lesen der Datei eine Fehlermeldung kommt. -.-

Hier noch mal der Code aus meiner Unit:

Delphi-Quellcode:
function IsFileInUse(aDateiname: string): Boolean;
var hFile: THandle;
begin
  Result:=False;

  if not FileExists(aDateiname) then Exit;
 
  hFile:=CreateFile(PChar(aDateiname), GENERIC_READ or GENERIC_WRITE or GENERIC_EXECUTE
                    ,0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result:=hFile=INVALID_HANDLE_VALUE;
  if not Result then CloseHandle(hFile);
end;
Fragen, Anregungen, Wünsche sind wie immer gern gesehen. :)

Interessanterweise, als ich die Zeile
Code:
if not FileExists(aDateiname) then Exit;
noch draußen hatte, ergab die Funktion grundsätzlich "true". :roll:

Uwe Raabe 24. Sep 2012 12:52

AW: IsFileInUse ergibt immer "false"
 
Dann check doch mal, ob du jetzt nicht generell bei dem FileExists schon rausfliegst. Eventuell hast du noch ein Problem beim Dateinamen.

DeddyH 24. Sep 2012 12:55

AW: IsFileInUse ergibt immer "false"
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1184169)
Eventuell hast du noch ein Problem beim Dateinamen.

Das sollte sich mit dem Debugger schnell herausfinden lassen.

Maya 24. Sep 2012 12:57

AW: IsFileInUse ergibt immer "false"
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1184169)
Dann check doch mal, ob du jetzt nicht generell bei dem FileExists schon rausfliegst. Eventuell hast du noch ein Problem beim Dateinamen.

Bei einer Datei, die ich NICHT aufhabe, beendet er die Funktion beim FileExists und gibt "false" zurück. Bei der Datei, die ich geöffnet habe in Excel, geht er ganz normal weiter in der Funktion und gibt ebenfalls "false" zurück.

DeddyH 24. Sep 2012 13:04

AW: IsFileInUse ergibt immer "false"
 
Hast Du Dir aDateiname einmal im Debugger angesehen? FileExists sollte ja theoretisch dasselbe zurückgeben, egal ob die Datei gerade geöffnet ist oder nicht.

Klaus01 24. Sep 2012 13:06

AW: IsFileInUse ergibt immer "false"
 
Delphi-Quellcode:
function IsFileInUse(FileName: TFileName): Boolean;
var
  HFileRes: HFILE;
begin
  Result := False;
  if not FileExists(FileName) then Exit;
  HFileRes := CreateFile(PChar(FileName),
                         GENERIC_READ or GENERIC_WRITE,
                         0,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then
    CloseHandle(HFileRes);
end;
Quelle

In dem Torry Beispiel wird nur auf Read oder Write getestet.
Wenn ein File ausführend geöffnet ist, kann es meines Wissen auch nicht beschrieben werden.

Hier ist noch ein anderes Beispiel zu finden.

Grüße
Klaus

Maya 24. Sep 2012 13:14

AW: IsFileInUse ergibt immer "false"
 
Zitat:

Zitat von DeddyH (Beitrag 1184176)
Hast Du Dir aDateiname einmal im Debugger angesehen? FileExists sollte ja theoretisch dasselbe zurückgeben, egal ob die Datei gerade geöffnet ist oder nicht.

Bingo! Ich habe nicht die richtige Variable übergeben vom Dateinnamen. Danke dir!

shmia 24. Sep 2012 14:12

AW: IsFileInUse ergibt immer "false"
 
Eigentlich müsste die Funktion IsFileInUse() ein dreiwertiges Ergebnis zurückliefern:
Code:
0=Datei vorhanden und nicht benützt
1=Datei vorhanden aber im Zugriff durch einen Prozess
2=Datei nicht vorhanden

himitsu 24. Sep 2012 16:46

AW: IsFileInUse ergibt immer "false"
 
Zitat:

Zitat von shmia (Beitrag 1184193)
Eigentlich müsste die Funktion IsFileInUse() ein dreiwertiges Ergebnis zurückliefern:
Code:
0=Datei vorhanden und nicht benützt
1=Datei vorhanden aber im Zugriff durch einen Prozess
2=Datei nicht vorhanden

oder

False=Datei vorhanden und nicht benützt
True=Datei vorhanden aber im Zugriff durch einen Prozess
Exception=Datei nicht vorhanden

Aber man darf den Funktionsnamen nicht für bare Münze nehmen, denn dieses erkennt nicht alle Zugriffe (mindestens 0.000...1% werden nicht, da nicht alle Zugriffe über ein FileHandle arbeiten)

Bernhard Geyer 24. Sep 2012 17:01

AW: IsFileInUse ergibt immer "false"
 
Zitat:

Zitat von shmia (Beitrag 1184193)
Eigentlich müsste die Funktion IsFileInUse() ein dreiwertiges Ergebnis zurückliefern:
Code:
0=Datei vorhanden und nicht benützt
1=Datei vorhanden aber im Zugriff durch einen Prozess
2=Datei nicht vorhanden

Und was ist mit dem Fall das Datei wegen fehlender NTFS-Rechte kein Zugriff erlaubt ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:30 Uhr.
Seite 1 von 2  1 2      

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