AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Access violation bei der Auflistung von Dateien
Thema durchsuchen
Ansicht
Themen-Optionen

Access violation bei der Auflistung von Dateien

Ein Thema von fdsgbla · begonnen am 27. Jan 2007 · letzter Beitrag vom 28. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
fdsgbla

Registriert seit: 6. Sep 2006
16 Beiträge
 
#1

Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 19:49
Warum kommt es bei der Funktion:

Delphi-Quellcode:
function VerzGroesse(Verzeichnis:string):longint;
var SR : TSearchRec;
    Groesse : longint;
begin
  Groesse:=0;
  if Verzeichnis[length(Verzeichnis)]<>'\then
    Verzeichnis:=Verzeichnis+'\';
  if FindFirst(Verzeichnis+'*.*',$3F,SR)=0 then begin
    repeat
      if ((SR.Attr and faDirectory)>0) and (SR.Name<>'.') and (SR.Name<>'..') then
        Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name)
      else
        Groesse:=Groesse+SR.Size;
      if (SR.Name<>'.') and (SR.Name<>'..') then
        FileListArray.Add(Verzeichnis+SR.Name);
    until FindNext(SR)<>0;
    FindClose(SR);
  end;
  Result:=Groesse;
end;
(stammt von http://www.delphi-fundgrube.de/faq03.htm#topic0310)

zu "Access violation" - Fehler

sie wird mit: self.caption := IntToStr(VerzGroesse('C:\Program Files\'))+' Byte'; aufgerufen. Der Ordner "Program Files" existiert und ist nicht leer.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 19:56
die einzige Stelle wo der Fehler auftreten kann ist bei
FileListArray.Add(Verzeichnis+SR.Name); FileListArray ist vermutlich nicht initialisiert.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
fdsgbla

Registriert seit: 6. Sep 2006
16 Beiträge
 
#3

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 20:09
Zitat von SirThornberry:
die einzige Stelle wo der Fehler auftreten kann ist bei
FileListArray.Add(Verzeichnis+SR.Name); FileListArray ist vermutlich nicht initialisiert.
so war es auch. Danke!!!!!!
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 20:28
Hallo,

du solltest auch beachten, daß die Routine bei Verzeichnisgrößen ab 2 GB falsche Werte liefert, weil sie alle Berechnungen mit dem Typ longint durchführt. Damit auch größere Verzeichnisse verarbeitet werden können, muß zunächst überall "longint" durch "int64" ersetzt werden. Wird der Code mit einer Delphi-Version vor Delphi 2006 übersetzt, muß eine weitere Zeile angepaßt werden:

Delphi-Quellcode:
// Groesse := Groesse + SR.Size;
Groesse := Groesse + Int64(SR.FindData.nFileSizeHigh) shl 32 + SR.FindData.nFileSizeLow;
Gruß Hawkeye
  Mit Zitat antworten Zitat
fdsgbla

Registriert seit: 6. Sep 2006
16 Beiträge
 
#5

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 20:41
Zitat von Hawkeye219:
Hallo,

du solltest auch beachten, daß die Routine bei Verzeichnisgrößen ab 2 GB falsche Werte liefert, weil sie alle Berechnungen mit dem Typ longint durchführt. Damit auch größere Verzeichnisse verarbeitet werden können, muß zunächst überall "longint" durch "int64" ersetzt werden. Wird der Code mit einer Delphi-Version vor Delphi 2006 übersetzt, muß eine weitere Zeile angepaßt werden:

Delphi-Quellcode:
// Groesse := Groesse + SR.Size;
Groesse := Groesse + Int64(SR.FindData.nFileSizeHigh) shl 32 + SR.FindData.nFileSizeLow;
Gruß Hawkeye
Auch Danke

Zählt TurboDelphi auch zu Delphi 2006?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 20:43
Zitat:
Zählt TurboDelphi auch zu Delphi 2006?
Ja.
Markus Kinzler
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 21:41
Moin fdsgbla,

mal abgesehen von dem 2GB Problem hat die Routine noch ein paar mehr:

Delphi-Quellcode:
function VerzGroesse(Verzeichnis:string):longint;
var SR : TSearchRec;
    Groesse : longint;
begin
  Groesse:=0;
  // Wenn Verzeichnis = '' => AV
  if Verzeichnis[length(Verzeichnis)]<>'\then
    Verzeichnis:=Verzeichnis+'\';
  // Warum $3F, wenn es dafür eine Konstante gibt (faAnyfile)
  if FindFirst(Verzeichnis+'*.*',$3F,SR)=0 then begin
   // Es fehlt try/finally um die Ausführung von FindClose abzusichern,
   // wenn FindFirst erfolgreich war
    repeat
      // > 0 funktioniert hier zwar, besser ist aber <> 0
      // oder = faDirectory. Der Wert könnte auch negativ sein
      if ((SR.Attr and faDirectory)>0) and (SR.Name<>'.') and (SR.Name<>'..') then
        Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name)
      else
        Groesse:=Groesse+SR.Size;
      // Da . und .. immer Verzeichnisse sind gehört das auch in die
      // vorherige if-Abfrage
      if (SR.Name<>'.') and (SR.Name<>'..') then
        FileListArray.Add(Verzeichnis+SR.Name);
    until FindNext(SR)<>0;
    FindClose(SR);
  end;
  Result:=Groesse;
end;
Es sollte besser so (oder ähnlich aussehen):

Delphi-Quellcode:
function VerzGroesse(Verzeichnis:string):longint;
var SR : TSearchRec;
    Groesse : longint;
begin
  Groesse:=0;
  if (Length(Verzeichnis) > 0) and Verzeichnis[length(Verzeichnis)]<>'\then Verzeichnis:=Verzeichnis+'\';
  if FindFirst(Verzeichnis+'*.*',faAnyFile,SR) = 0 then begin
    try
      repeat
        if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '.') and (SR.Name <> '..') then begin
          Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name);
          FileListArray.Add(Verzeichnis+SR.Name);
        end else begin
          Groesse:=Groesse+SR.Size;
        end;
      until FindNext(SR)<>0;
    finally
      FindClose(SR);
    end;
  end;
  Result:=Groesse;
end;
Wobei auch diese Variante möglich wäre

Delphi-Quellcode:
function VerzGroesse(Verzeichnis:string):longint;
var SR : TSearchRec;
    Groesse : longint;
begin
  Groesse:=0;
  if FindFirst(Verzeichnis+'\*.*',faAnyFile,SR) = 0 then begin
    try
      repeat
        if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '.') and (SR.Name <> '..') then begin
          Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name);
          FileListArray.Add(Verzeichnis+SR.Name);
        end else begin
          Groesse:=Groesse+SR.Size;
        end;
      until FindNext(SR)<>0;
    finally
      FindClose(SR);
    end;
  end;
  Result:=Groesse;
end;
da mehrere aufeinander folgende Pfadtrenner (\) nicht stören, so dass Verzeichnis auf \ enden, und man trotzdem die Suchmaske \*.* verwenden kann.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 22:06
Moin Chris,

Zitat von Christian Seehase:
[...]da mehrere aufeinander folgende Pfadtrenner (\) nicht stören[...]
mehrere aufeinander folgende nicht, ein vergessener schon:

Delphi-Quellcode:
// Groesse:=Groesse+VerzGroesse(Verzeichnis+SR.Name);
// FileListArray.Add(Verzeichnis+SR.Name);
Groesse:=Groesse+VerzGroesse(Verzeichnis+'\'+SR.Name);
FileListArray.Add(Verzeichnis+'\'+SR.Name);
Gruß Hawkeye
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 22:12
Moin Hawkeye,

da hast Du auch wieder recht.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
fdsgbla

Registriert seit: 6. Sep 2006
16 Beiträge
 
#10

Re: Access violation bei der Auflistung von Dateien

  Alt 27. Jan 2007, 22:14
Nochmals Danke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:42 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