![]() |
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* |
AW: TFileStream.Create gibt Error
Hallo,
wollte Dir nicht zu nahe treten. Zitat:
Zitat:
Gruß |
AW: TFileStream.Create gibt Error
Macht nix, ist aber interessant zu sehen dass es auffällt ;)
Das hab ich bisher nicht gehabt, aber gut zu wissen. Ja mein Mozilla prüft stündlich bis zu 400 Foreneinträge, die ich nicht alle manuell prüfen mag (Viel-Blogger, ja ich weiß das ist übertrieben und einige sind schon seit knapp nem Jahr nicht mehr beantwortet worden ...) ;) Natürlich kannst du das nicht wissen :D Kam auch nicht aufdringlich rüber :) Naja das mit dem Wer-ist-Online ... da hätte ich auch drauf kommen können :thumb: Ausserdem trifft man so eher auf nette Leute zum Plaudern :P Jetzt hab ich aber trotzdem noch ne Frage die aber glaub ich off-topic ist, reinwerfen tu ich die trotzdem mal ... ich komme mit canvas.pie nicht klar, wie erreichnet der/die/das pie den mittelpunkt, von dem aus gezeichnet wird? mitte zwischen X1 und X2 und Mitte zwischen Y1 und Y2? Ich wünsch hier mal ne gute Nacht, ich gönne mir jetzt meinen seligen Schönheitsschlaf :wink: |
AW: TFileStream.Create gibt Error
Hallo,
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
zeichnet schön ein Tortenstück auf das Canvas. div 2 ist meistens ein guter Kandidat die Mitte zu treffen.
procedure TForm4.Button3Click(Sender: TObject);
var r : TRect; begin r := Rect (0, 0, 200, 300); Canvas.Rectangle(r); Canvas.Pie (r.Left, r.top, r.Right, r.Bottom, r.Left, r.Right div 2, r.top, r.Bottom div 2); end; Zitat:
Gruß |
AW: TFileStream.Create gibt Error
Moin Zusammen,
das fmShareDenyNone hilft Dir nichts, wenn ein anderer Prozess die Datei exklusiv geöffnet hat. Die Verwendung von TSearchRec.Size funktioniert auch nur bedingt, da es auf 32-Bit begrenzt ist. Besser:
Delphi-Quellcode:
iFileSize := (sr.FindData.nFileSizeHigh shl 32) or (sr.FindData.nFileSizeLow);
|
AW: TFileStream.Create gibt Error
Ich will ja keine Werbung machen, aber mit
![]() |
AW: TFileStream.Create gibt Error
Zitat:
|
AW: TFileStream.Create gibt Error
Und da bin ich mit Programm V2, mal sehen wo ihr noch überall Fehler findet :P
Zitat:
Zitat:
Zitat:
Naja hab n bissl umgesattelt mit den vorhergehenden Beiträgen und meine Funktion, die auch (fast :P) funktioniert, sieht so aus:
Delphi-Quellcode:
Naja aber da scheint der irgendwie auch Dateien zu ignorieren, wenn ich einen Ordner (Bsp: 'C:\Users\Drahcir\' durchsuchen lasse, fehlen knapp 40GB, keine Ahnung wo die verschwinden :D naja ich arbeite noch dran ... Kanns sein dasses die Ordner mit den Namen '.' oder '..' sind, die ich ja bei allem geflissentlich übergehe, was sind die eigentlich? (ich glaub ich bin wieder Off-Topic aber gehört ja zu dem Programm)
function TfrmMain.getDirectoryGroesse(OrdnerPfad:string) : Int64;
var Rec : TSearchRec; Groesse : Int64; begin Groesse := 0; result := 0; if SysUtils.FindFirst(OrdnerPfad + '*', faAnyFile, Rec) = 0 then try repeat if (Rec.Name <> '.') and (Rec.Name <> '..') then begin if DirectoryExists(OrdnerPfad + Rec.Name) then begin Groesse := Groesse + getDirectoryGroesse(Ordnerpfad + Rec.Name + '\'); g_pLogFile.Warning('Öffne Ordner ' + Ordnerpfad + Rec.Name + '\'); end; if FileExists(OrdnerPfad + Rec.Name) then begin Groesse := Groesse + Rec.Size; g_pLogFile.Information('Datei ' + Ordnerpfad + Rec.Name + ' : ' + FormatFloat(' #,###.', Rec.Size)); end; end; until SysUtils.FindNext(Rec) <> 0; finally g_pLogFile.Warning('Ordnergröße ' + Ordnerpfad + Rec.Name + ' : ' + FormatFloat(' #,###.', Groesse)); SysUtils.FindClose(Rec); end; result := Groesse; end; Vielen Dank nochmal für die schnellen und tollen Antworten :) |
AW: TFileStream.Create gibt Error
Liste der Anhänge anzeigen (Anzahl: 1)
Kannst Du mal ausprobieren, ob das Programm im Anhang die richtige Größe ermittelt?
|
AW: TFileStream.Create gibt Error
Tut es, jetzt bin ich deprimiert :? Gibt exakt die richtige Bytezahl an ...
|
AW: TFileStream.Create gibt Error
Das arbeitet mit meiner Komponente, der Main-Quelltext hat gerade einmal 80 Zeilen. Vielleicht solltest Du die Dir tatsächlich einmal genauer anschauen. Mich persönlich interessiert vor allem, ob sie sich unter älteren Delphi-Versionen (< Delphi 7) installieren lässt ;)
|
AW: TFileStream.Create gibt Error
Zitat:
Natürlich mit Namenserwähnung wenns sein muss :D |
AW: TFileStream.Create gibt Error
Du kannst damit machen, was Du willst, steht auch so in der Lizenz ;)
|
AW: TFileStream.Create gibt Error
Zitat:
Ich binde deine Komponente nachher oder morgen ein, je nachdem, wie ich Zeit habe, und meld mich dann anschliessend wieder hier :) |
AW: TFileStream.Create gibt Error
Prima. Ich weiß mittlerweile, dass sich die Komponente in der Form nicht unter Delphi 5 installieren lässt. Falls das unter Delphi 6 genauso sein sollte: da kann man noch dran drehen, einfach Bescheid geben.
|
AW: TFileStream.Create gibt Error
Zitat:
Hab das grade überflogen uns muss sagen, auf Anhieb versteh ich da ... fast nichts. Auch nicht wie man die einbindet :D Naja ich beschäftige mich dann wenn ich viel Zeit und viel Lust hab mal damit ... :| Trotzdem bezweifel ich, dass mir das so auf Anhieb hilft xD |
AW: TFileStream.Create gibt Error
Eigentlich war ich bislang der Meinung, ich hätte sie ausführlich dokumentiert, inkl. der enthaltenen Demos :pale:
|
AW: TFileStream.Create gibt Error
Also hab mich mal hingesetzt ... so kompliziert scheints wirklich nicht zu sein, aber es funktioniert nicht.
Wenn ich die Demos als .dpr-Dateien öffne in Delphi bekomme ich eine Meldung bei MultiSearchDemo: "Fehler beim Lesen des Formulars Klasse TFileSearcher nicht gefunden. Fehler ignosrieren [...]" MiniExplorer: Fehler beim Lesen von tvFolders.Iems.NodeData: Eigenschaft NodeData exisitert nicht. Fehler ignorieren und [...]" Und nach klicken auf Ignorieren siehe MultiSearchDemo das selbe Ergebnis. bei ListViewDemo: Siehe MultiSearchDemo. Auch nachdem ich die entsprechenden Dateien aus Source (alle 4, da ich nicht weiß ob die gebraucht werden) ins Programmverzeichnis kopiert habe, treten die Fehler auf. In sofern bezweifel ich, dass ich die so problemlos einbinden kann. Wenn ich noch was für dich testen soll oder du fragen hast meld dich hier ... auch wenns off-topic ist *grins* :roll: //Edit: Wenn ich überall auf ignorieren drücke und dann das Programm in Delphi starte, gibt er mir ne Fehlermeldung dass er masks.dcu nicht kennt und der "braune Balken" der die Fehlermeldung angibt liegt in der Uses-Klausel. |
AW: TFileStream.Create gibt Error
Die Demos funktionieren nur dann, wenn die Komponente auch installiert wurde, also in der Komponentenpalette zur Verfügung steht.
|
AW: TFileStream.Create gibt Error
Zitat:
In der Hibfil stehen von alles Benutzer und allen Prozessen Informationen drin. Das ist schon etwas mehr vertraulich, daher KEINE Lese-Berechtigung. |
AW: TFileStream.Create gibt Error
Zur Unit masks habe ich
![]() |
AW: TFileStream.Create gibt Error
Zitat:
Hier im Forum denk ich ist dafür ein unpassender Ort, hast du Skype oder Teamspeak? Kannst mir ja ne PN schicken :) Sonst wäre ein IRC ja auch eine Möglichkeit, das Internet bietet ja große Auswahl :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:24 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