![]() |
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:
Wie kann ich aber nun schon VORAB prüfen, ob diese Datei lesbar ist (und nicht in MS Word geöffnet ist)? |
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:
zurückbekommen hat. Das kannst du natürlich auch noch einmal von hand machen, aber was hat man dadurch gewonnen?
INVALID_HANDLE_VALUE
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 ;-) |
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; |
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Beispiele findest du zuhauf hier:
![]() 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; |
AW: Wie feststellen, ob eine Datei gelesen werden kann?
|
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; |
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
Delphi-Quellcode:
für diesen Fall die richtigen Flags?
GENERIC_READ or GENERIC_WRITE
|
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 |
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 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