![]() |
TFileStream.Create gibt Error
Hab (wiedermal) n bissl und gebastelt und will jetzt ne Schleife die mir eine Ordnergröße angibt ... Dazu muss ich ja rekursiv alle Dateien durchgehen.
Die rekursive Schleife tut es, die Abfrage um Dateiengröße zu ermitteln auch ... fast immer. Hab ich zum Teil ausm Internet, teils selbst gebastelt:
Delphi-Quellcode:
Dazu muss man sagen, dass in "Dateiname" der vollständige Pfad und Dateiname mitgegeben werden (ja fehlerhafte Variablenbezeichnung).
{*** Funktion um Dateigröße zu ermitteln ***}
function TfrmMain.getDateiGroesse(Dateiname : string): int64; var Datei : TFileStream; begin result := 0; try if (Fileexists(Dateiname)) then begin g_pLogFile.Warning('Try to open ' + Dateiname) Datei := TFileStream.Create(Dateiname, fmOpenRead OR fmShareDenyNone); result := Datei.Size; end else g_pLogfile.Error('Datei ' + Dateiname + ' exisitiert nicht!') finally g_pLogFile.Warning('Datei ' + Dateiname + ' wird freigegeben') Datei.free; end; end; {************************} Bei fast allen Dateien funktioniert das auch, nur wenn ich den durch 'C:\' laufen lasse läuft es erst gut, viele Hundert Dateien werden erfolgreich wieder freigegeben (darunter auch verschiedene xxx.sys-Dateien, zum Beispiel 'C:\config.sys' und 'C:\AMD\..\atdcm64a.sys') nur kommt bei einigen Dateien eine EFOpenError-Exception mit der Meldung, die Datei (Bsp: 'C:\hiberfil.sys') könne nicht geöffnet werden. Naja hab Google und hier die Suche gefragt und bin nur über Lösungsvorschläge gestolpert, die Datei würde vielleicht nicht exisiteren, ... aber sie tut es auf jeden Fall, hab im Debug geschaut, der Dateiname wird richtig übergeben. Die Exception wird an der Stelle
Delphi-Quellcode:
aufgerufen.
Datei := TFileStream.Create(Dateiname, fmOpenRead OR fmShareDenyNone);
Mir ist jetzt aufgefallen wenn ich die Datei im Explorer betrachte, kommt das (siehe Bild) rum, kann mir selbst aber keinen Zusammenhang herstellen. Im Bild gezeigt sind die Dateien config.sys (funktioniert!), hiberfil.sys (funzt nicht), IO.SYS (ebenfalls nicht) und weitere Ordner oben die alle funktioniert haben. Kann mir wer weiterhelfen? Ich will nicht alle xxx.sys-Dateien ignorieren, was bei ner Ordnergrößenausgabe zu fehlerhaften Werten führt, mir würde es reichen wenn das Programm dokumentiert (g_pLogFile.Error('irgendeine Nachricht'), dass die Datei nicht geladen werden konnte und die Schleife aber nicht abbricht und ne Exception ausspuckt, sondern weiterläuft und als Result dann '0' für die Größe übergeben wird) Hier noch das Bild: ![]() |
AW: TFileStream.Create gibt Error
Die Datei existiert sicherlich( wenn Ruhezustand aktiviert ist), du bekommenst aber kein Zugriff auf sie.
|
AW: TFileStream.Create gibt Error
Das ich keinen Zugriff bekomme ist mir auch klar ... aber Delphi nicht.
Ich meine wie kann ich vor dem Öffnen der Datei prüfen, ob ich nen Zugriff bekomme oder nicht? denn beim Zugriff selbst, wo er schaut ob er Zugriff bekommt, stürzt er ja ab ... |
AW: TFileStream.Create gibt Error
.. Du könntest den Fehler abfangen..
Delphi-Quellcode:
Grüße
{*** Funktion um Dateigröße zu ermitteln ***}
function TfrmMain.getDateiGroesse(Dateiname : string): int64; var Datei : TFileStream; begin result := 0; try if (Fileexists(Dateiname)) then begin g_pLogFile.Warning('Try to open ' + Dateiname); try Datei := TFileStream.Create(Dateiname, fmOpenRead OR fmShareDenyNone); except on E:Exception do g_pLogfile.Error('Datei ' + Dateiname + E.Message); end; result := Datei.Size; end else g_pLogfile.Error('Datei ' + Dateiname + ' exisitiert nicht!') finally g_pLogFile.Warning('Datei ' + Dateiname + ' wird freigegeben') Datei.free; end; end; {************************} Klaus |
AW: TFileStream.Create gibt Error
Die Dateigrösse bekommst du auch ohne die Datei öffnen zu müssen.
So macht es zum Beispiel auch der Explorer. Um die Verzeichnisse zu durchsuchen verwendest du bestimmt
Delphi-Quellcode:
,
FindFirst
Delphi-Quellcode:
.
FindNext
In der Struktur
Delphi-Quellcode:
befindet sich auch die Dateigrösse.
TSearchRec
|
AW: TFileStream.Create gibt Error
Vielen Dank für die schnelle Hilfe :)
Das mit dem ...except... hab ich probiert, gibt mir sowohl in Delphi als auch als Exe ne Exception und der Haltepunkt auf on E... do ... wird nicht ausgelöst. Ja ich verwende FindFirst und FindNext, Quellcode:
Delphi-Quellcode:
Dann werd ich mir nochmal TSearchRec anschauen ... stimmt der Quellcode denn so oder liegts an dem?
{** Alle Dateien in einem Verzeichnis aufzählen **}
procedure TfrmMain.DateiListe(OrdnerPfad: string; Zielliste: TStrings); var Rec : TSearchRec; begin Zielliste.Clear; if SysUtils.FindFirst(OrdnerPfad + '*', faAnyFile, Rec) = 0 then try repeat if (Rec.Name <> '.') and (Rec.Name <> '..') then begin if DirectoryExists(OrdnerPfad + Rec.Name) then Zielliste.Add(OrdnerPfad + Rec.Name + '\'); if FileExists(OrdnerPfad + Rec.Name) then Zielliste.Add(OrdnerPfad + Rec.Name); end; until SysUtils.FindNext(Rec) <> 0; finally SysUtils.FindClose(Rec); end; end; {**************} |
AW: TFileStream.Create gibt Error
Zitat:
Es kommt drauf an, was du überhaupt erreichen möchtest. Auf jeden Fall kann man das Durchsuchen von Verzeichnissen allgemeiner (und eleganter) programmieren. Zum Beispiel hier: ![]() |
AW: TFileStream.Create gibt Error
Das Problem hat sich erledigt, mit TSearchRec.size erledigt sich das von selbst :)
Vielen Dank an alle Helfer :D // Die Namen in der StringList waren dafür da, diese dann nach und nach abzulaufen und deren Größe zu ermitteln. Aber hat sich erledigt. |
AW: TFileStream.Create gibt Error
Hallo,
vielleicht eine völlig dämliche Frage, aber ich sehe Du liest Deinen eigenen Thread jetzt seit mehreren Stunden immer wieder und immer wieder selbst, obwohl Du den Thread Zitat:
Gibt es doch noch Fragen? Gruß |
AW: TFileStream.Create gibt Error
Ich lese ihn weil, zugegeben mein Mozilla prüft alle Forenseiten alle Viertelstunde auf Aktualisierungen, und wenn da dann doch noch wer postet das ich antworten kann, auch wenn sich das Problem eigentlich gelöst hat.
Man will ja nicht unfreundlich erscheinen. Und wenn wer was fragt bezüglich meines Codes wieso ich was mache, dann antworte ich halt. Kann ja sein das ich Fehler mache und man mich drauf hinweisen möchte, auch wenn sich das Problem gelöst hat oder jemand meinen Quellcode im Nachhinein gut findet und entweder an der Entwicklung mitarbeiten oder zumindest den fertigen Quellcode gerne hätte. Hab ich alles schon erlebt ;) Aktuell Fragen hab ich keine, sonst würden die hier schon stehen ;) Gegenfrage: Wie siehst du das ich meinen Beitrag lese? *scared* |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 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