Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TFileStream.Create gibt Error (https://www.delphipraxis.net/172870-tfilestream-create-gibt-error.html)

Drahcir 26. Jan 2013 15:17

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:
{*** 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;
{************************}
Dazu muss man sagen, dass in "Dateiname" der vollständige Pfad und Dateiname mitgegeben werden (ja fehlerhafte Variablenbezeichnung).

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:
Datei := TFileStream.Create(Dateiname, fmOpenRead OR fmShareDenyNone);
aufgerufen.

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: http://www7.pic-upload.de/26.01.13/w583efyvse8o.jpg

mkinzler 26. Jan 2013 15:19

AW: TFileStream.Create gibt Error
 
Die Datei existiert sicherlich( wenn Ruhezustand aktiviert ist), du bekommenst aber kein Zugriff auf sie.

Drahcir 26. Jan 2013 15:26

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 ...

Klaus01 26. Jan 2013 15:34

AW: TFileStream.Create gibt Error
 
.. Du könntest den Fehler abfangen..

Delphi-Quellcode:
{*** 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;
{************************}
Grüße
Klaus

sx2008 26. Jan 2013 15:35

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:
TSearchRec
befindet sich auch die Dateigrösse.

Drahcir 26. Jan 2013 15:45

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:
{** 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;
{**************}
Dann werd ich mir nochmal TSearchRec anschauen ... stimmt der Quellcode denn so oder liegts an dem?

sx2008 26. Jan 2013 16:04

AW: TFileStream.Create gibt Error
 
Zitat:

Zitat von Drahcir (Beitrag 1200711)
stimmt der Quellcode denn so oder liegts an dem?

Das Problem an deinem Code ist, dass du nur die Dateinamen in die Stringliste abspeicherst; die anderen Daten also Grösse, Attribute und Datum/Uhrzeit gehen verloren.

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:
http://www.delphipraxis.net/1095038-post19.html

Drahcir 26. Jan 2013 16:13

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.

Volker Z. 27. Jan 2013 00:23

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:

Das Problem hat sich erledigt, mit TSearchRec.size erledigt sich das von selbst
selbst geschlossen hast.

Gibt es doch noch Fragen?

Gruß

Drahcir 27. Jan 2013 00:35

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 18:42 Uhr.
Seite 1 von 4  1 23     Letzte »    

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