Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie feststellen, ob eine Datei gelesen werden kann? (https://www.delphipraxis.net/188881-wie-feststellen-ob-eine-datei-gelesen-werden-kann.html)

PeterPanino 15. Apr 2016 19:12

Delphi-Version: 10 Seattle

Wie feststellen, ob eine Datei gelesen werden kann?
 
Hallo!

Ich möchte einen Text aus einer HTML-Datei auslesen:

Delphi-Quellcode:
ThisHTMLStr := Trim(TFile.ReadAllText(AHTMLFile));


Da diese Datei aber gerade in MS Word 2010 geöffnet ist, erhalte ich hier folgende Fehlermeldung:

Zitat:

Project xyz.exe raised exception class EFOpenError with message 'Cannot open file "F:\document.htm". Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird'.

Wie kann ich aber nun schon VORAB prüfen, ob diese Datei lesbar ist (und nicht in MS Word geöffnet ist)?

Der schöne Günther 15. Apr 2016 19:19

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
Ich persönlich finde das so richtig. Die EFOpenError-Exception behandeln heißt: Geht nüscht, kann nicht lesen. Ist wohl jemand anderes exklusiv drauf.

Wenn du auf der Exception anhälst siehst du auch dass der auch nur CreateFile(..) aus der WinApi aufgerufen und
Delphi-Quellcode:
INVALID_HANDLE_VALUE
zurückbekommen hat. Das kannst du natürlich auch noch einmal von hand machen, aber was hat man dadurch gewonnen?

Und von der theoretischen Möglichkeit dass sich jemand die Datei zwischen deiner Überprüfung und dem Versuch die Datei dann tatsächlich zu öffnen dann schnappt wollen wir erst gar nicht sprechen ;-)

PeterPanino 15. Apr 2016 19:31

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
Danke. Aber wie kann ich das VORAB feststellen? Also etwa:

Delphi-Quellcode:
if IsFileReadable(AHTMLFile) then
  ThisHTMLStr := Trim(TFile.ReadAllText(AHTMLFile))
else
  LogThisError;

Der schöne Günther 15. Apr 2016 19:36

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
Beispiele findest du zuhauf hier:
http://www.delphipraxis.net/dp_searc...Datei geöffnet .

Aber wie gesagt, was hat das für einen Vorteil gegenüber keine Extra Methode schreiben und einfach

Delphi-Quellcode:
try
   ThisHTMLStr := Trim(TFile.ReadAllText(AHTMLFile))
except
   LogThisError();
end;

Helmi 15. Apr 2016 20:11

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
Hallo,

hilft dir dieser, vielleicht einer etwas in die Jahre gekommener, Tipp der Schweizer weiter?

PeterPanino 15. Apr 2016 20:22

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
Mit diesem Code kann ich den Fehler bei einer geöffneten Datei umgehen:

Delphi-Quellcode:
function MyTempCopyFile(const AFile: string): string;
// Kopiert eine Datei in den Temp-Ordner und gibt den Namen der Kopie zurück (wenn erfolgreich)
var
  ThisTempFile: string;
begin
  Result := '';
  try
    ThisTempFile := TPath.GetTempFileName;
  except
    // Todo: Fehler loggen
    EXIT;
  end;
  try
    TFile.Copy(AFile, ThisTempFile, True);
  except
    // Todo: Fehler loggen
    EXIT;
  end;
  Result := ThisTempFile;
end;

// Fehler vermeiden, wenn die Datei etwa in MS Word geöffnet ist:
try
  ThisHTMLStr := Trim(TFile.ReadAllText(AHTMLFile));
except
  TempCopy := MyTempCopyFile(AHTMLFile);
  if TempCopy <> '' then
    ThisHTMLStr := Trim(TFile.ReadAllText(TempCopy));
end;

PeterPanino 15. Apr 2016 20:45

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
Zitat:

Zitat von Helmi (Beitrag 1335716)
Hallo,

hilft dir dieser, vielleicht einer etwas in die Jahre gekommener, Tipp der Schweizer weiter?

Ja, das ist ein guter Tipp. Da ich die Datei aber nur zum LESEN öffnen möchte: Sind
Delphi-Quellcode:
GENERIC_READ or GENERIC_WRITE
für diesen Fall die richtigen Flags?

p80286 16. Apr 2016 00:34

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
im Prinzip gibt es zwei Gründe warum eine Datei nicht gelesen werden kann
a) sie ist exclusiv von einem anderen Prozess geöffnet
b) der aufrufende Prozess hat keine Leseberechtigung

Das Resultat ist in beiden Fällen das gleiche, die Datei kann nicht geöffnet werden.
interessant wird es wenn man wissen will, warum?

Gruß
k-H

PeterPanino 16. Apr 2016 08:58

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
Zitat:

Zitat von p80286 (Beitrag 1335734)
im Prinzip gibt es zwei Gründe warum eine Datei nicht gelesen werden kann
a) sie ist exclusiv von einem anderen Prozess geöffnet
b) der aufrufende Prozess hat keine Leseberechtigung

Das Resultat ist in beiden Fällen das gleiche, die Datei kann nicht geöffnet werden.
interessant wird es wenn man wissen will, warum?

Gruß
k-H

In meinem Beitrag #6 habe ich gezeigt, wie man eine von einem anderen Programm exclusiv geöffnete Datei trotzdem lesen kann: Indem man sie kopiert.

Sir Rufo 16. Apr 2016 09:07

AW: Wie feststellen, ob eine Datei gelesen werden kann?
 
Zitat:

Zitat von PeterPanino (Beitrag 1335742)
Zitat:

Zitat von p80286 (Beitrag 1335734)
im Prinzip gibt es zwei Gründe warum eine Datei nicht gelesen werden kann
a) sie ist exclusiv von einem anderen Prozess geöffnet
b) der aufrufende Prozess hat keine Leseberechtigung

Das Resultat ist in beiden Fällen das gleiche, die Datei kann nicht geöffnet werden.
interessant wird es wenn man wissen will, warum?

Gruß
k-H

In meinem Beitrag #6 habe ich gezeigt, wie man eine von einem anderen Programm exclusiv geöffnete Datei trotzdem lesen kann: Indem man sie kopiert.

Was aber auch nur dann geht, wenn du auch Leserechte hast ... darauf wollte p80286 nur hinweisen


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 Uhr.
Seite 1 von 3  1 23      

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