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
Seite 1 von 2  1 2      
DieDolly

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

Ordnergröße ermitteln

  Alt 16. Dez 2023, 17:21
Ich finde dazu leider nur altes Zeug von vor über 10 Jahren.
Wie ermittelt man heute Ordnergrößen? Ich nutze dazu aktuell JclFileUtils.GetDirectorySize(), möchte abewr komplett vopnm Jcl weg.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.357 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Ordnergröße ermitteln

  Alt 16. Dez 2023, 21:21
Vielleicht hilft dir das weiter:
https://entwickler-ecke.de/topic_MDirStat_114798.html

Ansonsten gibt es noch Funktionen in der Unit System.IOUtils zur Auflistung von Dateien usw., die hilfreich sein könnten. Allerdings musst du da aufpassen mit Junctions usw., was in dem obigen Tool bereits berücksichtigt wird.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ordnergröße ermitteln

  Alt 16. Dez 2023, 22:20
Leider fehlt immernoch etwas Wichtiges,
https://quality.embarcadero.com/browse/RSP-41662

aber
Delphi-Quellcode:
  var Size: Int64 := 0;
  TDirectory.GetFiles('C:\Users', '*.jpg', TSearchOption.soAllDirectories,
    function(const Path: string; const SearchRec: TSearchRec): Boolean
    begin
      Inc(Size, SearchRec.Size);
    end);
  ShowMessage(Size.ToString);
Wobei es in 85 Jahren vielleicht mal irgendwie so aussehn könnte
Delphi-Quellcode:
  var Size: Int64 := 0;
  for var FileEntry in TDirectory.GetFileIrgendwas('C:\Users', '*.jpg', soAllDirectories) do
    Inc(Size, FileEntry.Size);
  ShowMessage(Size.ToString);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Ordnergröße ermitteln

  Alt 16. Dez 2023, 23:16
Nur so aus dem Bauch heraus, noch nicht getested da nur hier getippt...
Delphi-Quellcode:
uses System.IOUtils;

function GetDirectorySize(const Dir: string): Int64;
var
 Files: TArray<string>;
 SubDirs: TArray<string>;
 FileSize: Int64;
 i: Integer;
begin
 Result := 0;
 Files := TDirectory.GetFiles(Dir);
 for i := 0 to High(Files) do
   Result := Result + TFile.GetSize(Files[i]);
 SubDirs := TDirectory.GetDirectories(Dir);
 for i := 0 to High(SubDirs) do
   Result := Result + GetDirectorySize(SubDirs[i]);
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
461 Beiträge
 
#5

AW: Ordnergröße ermitteln

  Alt 16. Dez 2023, 23:27
Wobei es in 85 Jahren vielleicht mal irgendwie so aussehn könnte
Ist schon heute möglich:
Delphi-Quellcode:
uses
  mormot.core.text,
  mormot.core.search;

begin
  var size: Int64 := 0;
  for var run: TFindFiles in FindFiles('c:\Users\', '*.png;*.jpg;*.jpeg', '', [ffoSubFolder]) do
    Inc(size, run.Size);
  ShowMessage(Format('Size: %s', [KB(size)])); // Size: 210.5 MB
Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ordnergröße ermitteln

  Alt 17. Dez 2023, 03:58
@KodeZwerg:

GetFiles kann auch direkt Rekursiv,
bzw. man kann sich Dateien und Verzeichnisse auch gleichzeitig geben lassen.

Ja, es gibt TFile.GetSize
aber das fragt somit mehrmals das selbe Verzeichnis ab, einmal für den Dateinamen und nochmal für die Größe.

Blöd dabei ist dann, dass FindFiles/GetFiles bereits die Dateigröße mit abgefragt hatte,
aber die neuen Delphi-Funktionen zu dämlich sind, das uns rauszugeben (außer eben innerhalb des "Filters")

Wenn du schon selbst das Rekursive machen willst, dann nimm besser die "alten" FindFiles (FindFirstFile),
da bekommst'e dann auch mit einer Abfrage Dateien+Verzeichnisse und dann in der Schleife nur noch Inc bei Datei und das Rekursive wenn Verzeichnis.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DieDolly

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

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
43.166 Beiträge
 
Delphi 12 Athens
 
#8

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DieDolly

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

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
43.166 Beiträge
 
Delphi 12 Athens
 
#10

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Dez 2023 um 17:04 Uhr)
  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 17:55 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