Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   GetFolderSize (https://www.delphipraxis.net/180205-getfoldersize.html)

value is NULL 30. Apr 2014 12:52

GetFolderSize
 
Hi ihr lieben

Habe ein Problem: Ich schreibe mit meinem Programm auf eine DVD-RAM. In meinem Programm kann ich eine "maxsize" angeben. Soll heißen, das der Ordner in dem ich schreibe nicht größer als X werden darf.
Das bedeutet das ich vor jedem Kopiervorgang prüfe, wie viel Platz ich noch zur Verfügung habe. Das passiert mit folgendem Code:

Delphi-Quellcode:
function getFolderSize(FolderName: string): Int64;
var
  fldr, fso: OleVariant;
begin
  fso := CreateOleObject('Scripting.FileSystemObject');
  fldr := fso.GetFolder(FolderName);

  result := fldr.size;
end;
Das Problem ist, das ich eine "maxsize" von 4GB habe und die Abfrage, wie viel Platz noch zur Verfügung steht ziemlich lange dauert :/

Hat jemand einen Tipp wie ich das beschleunigen kann?

Danke im Voruas

DeddyH 30. Apr 2014 13:02

AW: GetFolderSize
 
Wäre es nicht günstiger, die Gesamtgröße aller zu schreibenden Dateien und die der evtl. bereits vorhandenden einmalig zu ermitteln? Wenn die Summe der beiden größer als die Maximalgröße ist, kann man ja gleich eine Meldung ausgeben oder etwas in der Art.

value is NULL 30. Apr 2014 13:23

AW: GetFolderSize
 
Das wäre natürlich das beste, das Problem dabei ist, das laufend neue Dateien kommen, welche exportiert werden sollen. Soll heißen, das ich mir aus einer Datenbank auslese ob es neue Sachen gibt, wenn ja lese ich mir die neuen Werte ein und arbeite sie nacheinander ab. Ist ein "Auftrag" erledigt setze ich in der Datenbank eine Art "archived" flag und lese wieder ob es etwas neues gibt.

somit weiß ich eigentlich nie wie viel ich jetzt zu tun habe. Kann sein das mein Programm stundenlang Arbeitslos ist oder auch dauerhaft weg sichert.

himitsu 30. Apr 2014 14:22

AW: GetFolderSize
 
Musst du unbesingt über Scripting.FileSystemObject gehen?

FindFirst und Co. gibt es ja auch.

Eventuell kann man da auch eine Verzeichnisüberwachung aktivieren.
- einmal die Größe bestimmen (sich auch gleich mal alles in einer Liste merken)
- und dann bei einer Änderungsmeldung nur die geänderten Dateien zur alten Gesamtsumme dazurechnen/abziehen

DeddyH 30. Apr 2014 14:24

AW: GetFolderSize
 
OK, aber es müsste doch trotzdem genügen, den noch verfügbaren Speicherplatz einmalig (bei Programmstart z.B.) zu ermitteln. Kommt eine neue Datei, wird deren Größe ermittelt. Ist diese kleiner als die Differenz zwischen aktuellem und Maximalwert, wird sie gesichert und der aktuelle Wert entsprechend erhöht. Das dürfte um Einiges performanter sein, als bei jeder Datei erst die komplette Ordnergröße ermitteln zu lassen.

p80286 30. Apr 2014 15:35

AW: GetFolderSize
 
Zitat:

Zitat von DeddyH (Beitrag 1257528)
OK, aber es müsste doch trotzdem genügen, den noch verfügbaren Speicherplatz einmalig (bei Programmstart z.B.) zu ermitteln. Kommt eine neue Datei, wird deren Größe ermittelt.

Wobei zu beachten ist, daß "Größe" vom verwendeten Medium abhängig ist. Läßt man NTFS mal außen vor, kleine Dateien gleich in Verzeichnis stecken) so gilt
Code:
Größe=GrößeinByte div ClusterGrößeMedium + 1
(Ja ich weiß da kann ein ganzes Cluster Verschnitt bei sein, aber bisher war ich damit auf der sicheren Seite)

Gruß
K-H

DeddyH 30. Apr 2014 15:40

AW: GetFolderSize
 
Stimmt, aber mir ging es jetzt eher ums Prinzip.

himitsu 30. Apr 2014 15:47

AW: GetFolderSize
 
Fehlt da nicht noch ein Mal, oder soll Größe wirklich die Clusteranzahl angeben?

Delphi-Quellcode:
Größe = ((GrößeinByte - 1) div ClusterGrößeMedium + 1) * ClusterGrößeMedium; // Und schon ist der Verschnitt weg (runtergerechnet)

Größe = (GrößeinByte + ClusterGrößeMedium - 1) div ClusterGrößeMedium * ClusterGrößeMedium; // es lässt sich auch hochzu rechnen

Größe = Ceil(GrößeinByte / ClusterGrößeMedium) * ClusterGrößeMedium; // oder direkt mit Aufrunden

und mit Bitoperationen lässt es auch noch recht nett lösen (beim Zweiten das Mal und Durch gegen ein Und getauscht)
Nja, und dann noch der Offset für das Dateisystem.

p80286 30. Apr 2014 22:45

AW: GetFolderSize
 
Zitat:

Zitat von himitsu (Beitrag 1257552)
Fehlt da nicht noch ein Mal, oder soll Größe wirklich die Clusteranzahl angeben?

:oops::oops:
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 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