AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ordnergröße ermitteln

Ein Thema von DieDolly · begonnen am 16. Dez 2023 · letzter Beitrag vom 17. Dez 2023
Antwort Antwort
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

AW: Ordnergröße ermitteln

  Alt 17. Dez 2023, 13:55
Danke für die Antworeten. Ich habe mir den Code aus JclUtils genommen und angepasst.
Delphi-Quellcode:
function GetDirectorySize(const Path: string): Int64;
 function RecurseFolder(const Path: string): Int64;
 var
  F: TSearchRec;
  R: Integer;
  TempSize: TWin32FileAttributeData;
 begin
  Result := 0;
  R := System.SysUtils.FindFirst(Path + '*.*', faAnyFile, F);
  if R = 0 then
   try
    while R = 0 do
     begin
      if (F.Name <> '.') and (F.Name <> '..') then
       begin
        if (F.Attr and faDirectory) = faDirectory then
         Inc(Result, RecurseFolder(Path + F.Name + '\'))
        else
         begin
          TempSize.nFileSizeLow := F.FindData.nFileSizeLow;
          TempSize.nFileSizeHigh := F.FindData.nFileSizeHigh;
          Inc(Result, TempSize.nFileSizeHigh shl 32 + TempSize.nFileSizeLow);
         end;
       end;
      R := System.SysUtils.FindNext(F);
     end;
    if R <> ERROR_NO_MORE_FILES then
     Abort;
   finally
    System.SysUtils.FindClose(F);
   end;
 end;

begin
 if not DirectoryExists(ExcludeTrailingBackslash(Path)) then
  Result := -1
 else
  try
   Result := RecurseFolder(IncludeTrailingBackslash(Path))
  except
   Result := -1;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#2

AW: Ordnergröße ermitteln

  Alt 17. Dez 2023, 14:31
https://docwiki.embarcadero.com/Libr...SearchRec.Size

Und TempSize.nFileSizeHigh vor dem Shift nicht auf 64 Bit zu casten, dürfte auch viel Spaß bereiten.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: Ordnergröße ermitteln

  Alt 17. Dez 2023, 16:47
Zitat:
Und TempSize.nFileSizeHigh vor dem Shift nicht auf 64 Bit zu casten, dürfte auch viel Spaß bereiten.
Wie wäre es richtig? So in etwa ist es auch in der JclFileUtils.pas.

So? Inc(Result, (Int64(TempSize.nFileSizeHigh) shl 32) + TempSize.nFileSizeLow);

Geändert von DieDolly (17. Dez 2023 um 16:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.553 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ordnergröße ermitteln

  Alt 17. Dez 2023, 16:57
Nja, das ist ein 32-Bit UInt und wenn man da alles um 32 Bit nach links verschiebt, dann rutscht alles raus und ist weg.
Der Compiler kommt auch nicht immer auf die Idee sowas von sich aus einfach so zu vergrößern (normal maximal bis zur Größe eines Registers)

So := Int64(TempSize.nFileSizeHigh) shl 32 or TempSize.nFileSizeLow; wäre es demnach schon sicherer,

aber wie schon genannt ... Warum nicht einfach F.Size, anstatt F.FindData.nFileSize* ?



PS: Da wir hier Signed rechnen, ist es binär sicherer, als arithmetisch.

OK, man könnte auch := Int64(UInt64(TempSize.nFileSizeHigh) shl 32) + TempSize.nFileSizeLow; , aber warum.
z.B. gäbe es Probleme und die Größe wäre z.B. -1, dann würde es nach Umrechnung mit einer signed Addition einen anderen Wert ergeben.

Alternativ einfach nur casten und garnicht rechnen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Dez 2023 um 17:04 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: Ordnergröße ermitteln

  Alt 17. Dez 2023, 18:29
Habe das jetzt abgeändert. TempSize ist jetzt ganz weg.
Delphi-Quellcode:
      if (F.Name <> '.') and (F.Name <> '..') then
       begin
        if (F.Attr and faDirectory) = faDirectory then
         Inc(Result, RecurseFolder(Path + F.Name + '\'))
        else
         Inc(Result, F.Size); // <=
       end;
  Mit Zitat antworten Zitat
Antwort Antwort


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