AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TFileStream.Create gibt Error

Ein Thema von Drahcir · begonnen am 26. Jan 2013 · letzter Beitrag vom 29. Jan 2013
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#1

TFileStream.Create gibt Error

  Alt 26. Jan 2013, 15:17
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
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
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TFileStream.Create gibt Error

  Alt 26. Jan 2013, 15:19
Die Datei existiert sicherlich( wenn Ruhezustand aktiviert ist), du bekommenst aber kein Zugriff auf sie.
Markus Kinzler
  Mit Zitat antworten Zitat
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#3

AW: TFileStream.Create gibt Error

  Alt 26. Jan 2013, 15:26
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 ...
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TFileStream.Create gibt Error

  Alt 26. Jan 2013, 15:34
.. 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: TFileStream.Create gibt Error

  Alt 26. Jan 2013, 15:35
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 FindFirst , FindNext .
In der Struktur TSearchRec befindet sich auch die Dateigrösse.
  Mit Zitat antworten Zitat
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#6

AW: TFileStream.Create gibt Error

  Alt 26. Jan 2013, 15:45
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?
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: TFileStream.Create gibt Error

  Alt 26. Jan 2013, 16:04
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
  Mit Zitat antworten Zitat
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#8

AW: TFileStream.Create gibt Error

  Alt 26. Jan 2013, 16:13
Das Problem hat sich erledigt, mit TSearchRec.size erledigt sich das von selbst

Vielen Dank an alle Helfer

// 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.
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#9

AW: TFileStream.Create gibt Error

  Alt 27. Jan 2013, 00:23
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ß
Volker Zeller
  Mit Zitat antworten Zitat
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#10

AW: TFileStream.Create gibt Error

  Alt 27. Jan 2013, 00:35
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*
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:33 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