AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie feststellen, ob eine Datei gelesen werden kann?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie feststellen, ob eine Datei gelesen werden kann?

Ein Thema von PeterPanino · begonnen am 15. Apr 2016 · letzter Beitrag vom 19. Apr 2016
Antwort Antwort
Seite 1 von 3  1 23      
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#1

Wie feststellen, ob eine Datei gelesen werden kann?

  Alt 15. Apr 2016, 19:12
Delphi-Version: 10 Seattle
Hallo!

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

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)?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 15. Apr 2016, 19:19
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 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
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 15. Apr 2016, 19:31
Danke. Aber wie kann ich das VORAB feststellen? Also etwa:

Delphi-Quellcode:
if IsFileReadable(AHTMLFile) then
  ThisHTMLStr := Trim(TFile.ReadAllText(AHTMLFile))
else
  LogThisError;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

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

  Alt 15. Apr 2016, 19:36
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;
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#5

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

  Alt 15. Apr 2016, 20:11
Hallo,

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

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 15. Apr 2016, 20:22
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;
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 15. Apr 2016, 20:45
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 GENERIC_READ or GENERIC_WRITE für diesen Fall die richtigen Flags?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

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

  Alt 16. Apr 2016, 00:34
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 16. Apr 2016, 08:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

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

  Alt 16. Apr 2016, 09:07
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:28 Uhr.
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