Delphi-PRAXiS

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?

Maya 25. Sep 2012 05:09

AW: IsFileInUse ergibt immer "false"
 
Zitat:

Zitat von himitsu (Beitrag 1184226)
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)

Allerdings. Wenn ich die CSV-Dateien per Editor geöffnet habe, wird der Zugriff nicht erkannt, nur mal als Beispiel.

DeddyH 25. Sep 2012 07:01

AW: IsFileInUse ergibt immer "false"
 
Hilft Dir IsFileOpen weiter?

Sir Rufo 25. Sep 2012 07:37

AW: IsFileInUse ergibt immer "false"
 
Wenn ein Programm eine Datei öffnet den Inhalt ausliest, in der GUI anzeigt und dann die Datei wieder schließt, dann wird der Dateiinhalt zwar angezeigt (landläufig auch als "Datei geöffnet" bezeichnet), aber die Datei ist nicht geöffnet.

Die Fragestellung sollte also eigentlich lauten: "Wie kann ich vor dem Öffnen der Datei feststellen, ob diese auch zum Lesen geöffnet werden kann (und weitere Schreiboperationen durch andere Programme verhindert werden)?"

himitsu 25. Sep 2012 07:55

AW: IsFileInUse ergibt immer "false"
 
Zitat:

Zitat von Sir Rufo (Beitrag 1184282)
Zitat:

Zitat von Maya (Beitrag 1184273)
Allerdings. Wenn ich die CSV-Dateien per Editor geöffnet habe, wird der Zugriff nicht erkannt, nur mal als Beispiel.

Wenn ein Programm eine Datei öffnet den Inhalt ausliest, in der GUI anzeigt und dann die Datei wieder schließt, dann wird der Dateiinhalt zwar angezeigt (landläufig auch als "Datei geöffnet" bezeichnet), aber die Datei ist nicht geöffnet.

Jupp, es gibt einen Unterschied zwischen "Hat ein Programm die Datei gerade geöffnet?" und "Wurde die Datei irgendwann ausgelesen und wird eine Kopie des Inhalts gerade angezeigt."

z.B. beim TMemo wird die "Datei" nur während LoadFromFile geöffnet, danach gleich wieder geschlossen und dann wird nur eine Kopie im Memo angezeigt.

Maya 25. Sep 2012 08:19

AW: IsFileInUse ergibt immer "false"
 
Zitat:

Zitat von DeddyH (Beitrag 1184279)
Hilft Dir IsFileOpen weiter?

Ich sag mal so, wenn es mit dem Editor geöffnet ist, stört es nicht beim Einlesen, da auch Delphi keine Fehlermeldung bringt, dass die Datei schon benutzt wird. Dies geschieht nur, wenn per Excel die Datei geöffnet wird und das wird mit "IsFileInUse" ja abgefangen und klappt auch so, wie ich das will. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 Uhr.

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