Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist (https://www.delphipraxis.net/118867-verzeichnisgroesse-gerechnet-wenn-verzeichnis-2gb-ist.html)

Kostas 16. Aug 2008 19:05


Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Hallo Zusammen,

die Function habe ich bis jetzt eingesetzt um die Verzeichnisgröße herauszufinden.
Das funktioniert solange keine Datei größer ist als 2GB weil rec.Size ein Integer
ist. Ich habe Verzeichnisse die grössere Dateien enthalten z.B.: Image Files aus der
Datensicherung. Mit rec.Size bekomme ich natürlich Müll geliefert.

Kennt Jemand eine andere Möglichkeit die Verzeichnisgröße abzufragen?


Delphi-Quellcode:
{-----------------------------------------------------------}
{}function GetDirSize(dir: string; subdir: Boolean): Int64;
{-----------------------------------------------------------}
//label1.Caption := FloatToStr(GetDirSize('e:\download', False) / Sqr(1024)) + ' MBytes';

var
  rec: TSearchRec;
  found: Integer;
begin
  Result := 0;
  if dir[Length(dir)] <> '\' then dir := dir + '\';
  found := FindFirst(dir + '*.*', faAnyFile, rec);
  while found = 0 do
  begin
    Inc(Result, rec.Size);
    if (rec.Attr and faDirectory > 0) and (rec.Name[1] <> '.') and (subdir = True) then
      Inc(Result, GetDirSize(dir + rec.Name, True));
    found := FindNext(rec);
  end;
  FindClose(rec);
end;{GetDirSize}

Gruß Kostas

Christian Seehase 16. Aug 2008 19:12

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Moin Kostas,

schau Dir mal TSearchRec.FindData an.

BTW:
Delphi-Quellcode:
(rec.Name[1] <> '.')
ist falsch. Man muss explizit auf <> '.' und <> '..' prüfen, da Verzeichnis- und Dateinamen auch mit einem Punkt beginnen können.

Kostas 16. Aug 2008 19:30

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Zitat:

Zitat von Christian Seehase
Moin Kostas,

schau Dir mal TSearchRec.FindData an.

BTW:
Delphi-Quellcode:
(rec.Name[1] <> '.')
ist falsch. Man muss explizit auf <> '.' und <> '..' prüfen, da Verzeichnis- und Dateinamen auch mit einem Punkt beginnen können.

Danke für den Hinweis. Habs wohl übersehen. Das Problem mit dem Dateien >2GB ist damit natürlich nicht gelöst.

Gruß Kostas

marabu 16. Aug 2008 19:37

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Hallo Kostas,

vielleicht ist das etwas für dich: FolderSize()

Freundliche Grüße

C.Schoch 16. Aug 2008 20:30

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Hi,
So sollte es gehen:

Delphi-Quellcode:
{-----------------------------------------------------------}
{}function GetDirSize(dir: string; subdir: Boolean): Int64;
{-----------------------------------------------------------}
//label1.Caption := FloatToStr(GetDirSize('e:\download', False) / Sqr(1024)) + ' MBytes';

var
  rec: TSearchRec;
  found: Integer;
  iSize : int64:
begin
  Result := 0;
  if dir[Length(dir)] <> '\' then dir := dir + '\';
  found := FindFirst(dir + '*.*', faAnyFile, rec);
  while found = 0 do
  begin
    Int64Rec(iSize).Hi := Rec.FindData.nFileSizeHigh;
    Int64Rec(iSize).Lo := Rec.FindData.nFileSizeLow;
    Inc(Result, iSize);
    if (rec.Attr and faDirectory &gt; 0) and (rec.Name[1] &lt;&gt; '.') and (subdir = True) then
      Inc(Result, GetDirSize(dir + rec.Name, True));
    found := FindNext(rec);
  end;
  FindClose(rec);
end;{GetDirSize}

omata 16. Aug 2008 20:41

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Korrektur...

Delphi-Quellcode:
{-----------------------------------------------------------}
function GetDirSize(dir: string; subdir: Boolean): Int64;
{-----------------------------------------------------------}
var
  rec: TSearchRec;
  found: Integer;
  iSize : int64:
begin
  Result := 0;
  if dir[Length(dir)] <> '\' then
    dir := dir + '\';
  found := FindFirst(dir + '*.*', faAnyFile, rec);
  while found = 0 do
  begin
    Int64Rec(iSize).Hi := Rec.FindData.nFileSizeHigh;
    Int64Rec(iSize).Lo := Rec.FindData.nFileSizeLow;
    Inc(Result, iSize);
    if    (rec.Attr and faDirectory > 0)
       and (rec.Name <> '.')
       and (rec.Name <> '..')
       and subdir then
    begin
      Inc(Result, GetDirSize(dir + rec.Name, True));
    end;
    found := FindNext(rec);
  end;
  FindClose(rec);
end; {GetDirSize}

littleDave 16. Aug 2008 20:59

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Oder als Einzeiler:
Delphi-Quellcode:
var
  iSize : int64:
begin
  // ...
  iSize := int64(Rec.FindData.nFileSizeHigh) shl 32 + Rec.FindData.nFileSizeLow;
  // ...
end;

Kostas 16. Aug 2008 21:03

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Perfekt Leute,

und schon wieder ein Sieg

Ein herzliches Dankeschön.

Gruß Kostas

sx2008 16. Aug 2008 23:28

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Delphi-Quellcode:
if ((rec.Attr and faDirectory > 0).. // so sollte man das Bit nicht abfragen
// falls man das höchstwertige Bit abfragt, wird das Ergebnis negativ
// daher:
if ((rec.Attr and faDirectory <> 0)..

Luckie 17. Aug 2008 01:14

Re: Verzeichnisgröße gerechnet wenn Verzeichnis >2GB ist
 
Ich hätte es sogar so gemacht:
Delphi-Quellcode:
if ((rec.Attr and faDirectory = faDirectory)..
Siehe dazu auch hier: http://www.michael-puff.de/Artikel/BitMasken.shtml
Es handelt sich nämlich bei den Attributen um eine Bit-Maske.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr.
Seite 1 von 2  1 2      

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