![]() |
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:
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Welche Art von User sollte keine Leserechte haben?
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Wenn die Datei in einem anderen Process exklusiv oder zum schreiben geöffnet ist geht das nicht
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Also bei mir geht das Kopieren wie in Beitrag #6 demonstriert, wenn die Datei in MS Word geöffnet ist. Besser gesagt es läuft. :wink:
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Natürlich, das ist doch klar. Wenn's gar nicht geht, muss wohl ggf. eine Meldung an den Benutzer ausgegeben werden, dass er das blockierende Programm schließen soll. Aber mit meiner Lösung aus Beitrag #6 ist sichergestellt, dass es in einer höheren Anzahl von Fällen funktioniert als ohne diese Lösung.
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Du kannst auch die Datei direkt öffnen und dabei FILE_SHARE_WRITE als Flag angeben, z.B. bei einem Filestream. Das sollte genauso oft klappen wie die Kopie.
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Da wäre eine Routine recht praktisch, mit der man (direkt, also nicht durch Rückschlüsse) herausfinden kann, mit welchen Flags eine Datei geöffnet ist. Gibt's denn sowas?
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
Wenn Du Dir die Eigenschaften einer Datei anschaut (Sicherheit) findest Da wahrscheinlich Authentifizierte Benutzer System Administratoren Benutzer Wenn Du, falls Du die entsprechenden Rechte hast, die "Authentifizierte Benutzer" und "Benutzer" löschst, haben normale Benutzer ein echtes Problem diese Datei zu lesen, geschweige denn zu editieren. Statt zu löschen kannst Du auch Rechte verweigern, was ich allerdings nicht empfehlen kann, da die Rechteverweigerung der schnellste Weg zur Erzeugung von Datei-Zombies ist. Gruß K-H |
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
Und das einzige, was hier sinnvoll ist, ist die Aktion zu probieren. Und wenn es nicht ging, dann gab es wohl ein Problem und man kann eine Fehlermeldung anzeigen. Die Info, ob eine Datei schreibbar ist, ist ja in dem Moment schon veraltet (und damit nutzlos) in dem die sie bekommst. Stell dir eine Anwendung vor, die 10 Mal pro Sekunde eine Datei exklusiv zum schreiben öffnet, eine Zeile schreibt und wieder schließt. Doofes Programm, aber kann man machen. Und du versuchst, die gleiche Datei zu öffnen. Wenn du dann sowas machst wie
Delphi-Quellcode:
Ist dein Programm instabil, weil es dennoch zu einer Exception kommen kann!
if IsFileReadable(AHTMLFile) then
ThisHTMLStr := TFile.ReadAllText(AHTMLFile) else LogThisError; Denk' immer dran, dein Programm kann jederzeit unterbrochen werden. Und bevor du wieder drankommst können potenziell alle anderen Prozesse im System laufen. Und dann bin ich gerade noch auf ![]() Es könnte also sein, dass die Datei zwar in Verwendung ist, du aber den Schreibzugriff trotzdem bekommst, wenn du fragst ;-) |
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Wie ich jetzt entdeckt habe, entsteht seltsamerweise kein Fehler, wenn eine .DOC-Datei (also NICHT .DOCX) gelesen wird, während sie in MS Word 2010 geöffnet ist.
Seltsam! |
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Wirklich seltsam. Bei mir (Windows 8.1, Word 2010, lokaler Zugriff, also kein Netzwerk) kann ich keinen Unterschied zwischen .doc und .docx feststellen. Beide können gelesen, aber natürlich nicht beschrieben werden, wenn sie in Word geöffnet sind.
|
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Das kommt auf die Art und Weise an mit der der Zugriff erfolgt. Das Auslesen einer .doc geht auch ohne share write, weil diese für die neue Word Version konvertiert und nicht direkt geöffnet wird.
Die .docx wird hingegen direkt geöffnet und kann daher nur mit share write Flag geöffnet werden. |
AW: Wie feststellen, ob eine Datei gelesen werden kann?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 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