AGB  ·  Datenschutz  ·  Impressum  







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

Laufwerkgrössen ermitteln

Ein Thema von Delbor · begonnen am 21. Okt 2021 · letzter Beitrag vom 29. Okt 2021
Antwort Antwort
Seite 2 von 3     12 3      
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Laufwerkgrössen ermitteln

  Alt 23. Okt 2021, 18:15
Hi zusammen

Inzwischen hab ich auch noch weiter gesucht, auch in Sachen Bit&Byte-Umrechnung und versucht, mit der gefundenen Demo auf 'einen grünen Zweig' zu kommen. Was ich dabei gefunden habe: GetDiskFreeSpace ist offenbar veraltet. Zumindest hab ich im Embarcadero-Wikki vergebens danach gesucht. Hingegen hab ich eine Bool-Funktion GetDiskFreeSpaceEx gefunden, allerdings bisher nicht aufrufen können.
Mal zum Vergleich die gefundene Anwendung und die Anzeige des Explorers:
14_22_32-vol_info-delphi-10.4-main-3.jpg
explorer.jpg
Der Code zu der Ausgabe dieses Programmes:

Delphi-Quellcode:
  GetDiskFreeSpace(PChar(drv), SectPerCls, BytesPerCls, FreeCls, TotCls);
  Showmessage( 'SectPerCls := ' + IntToStr(SectPerCls) + sLineBreak +
               'BytesPerCls := ' + IntToStr(BytesPerCls) + sLineBreak +
               ' FreeCls := ' + IntToStr(FreeCls) + sLineBreak +
               ' TotCls := ' + IntToStr(TotCls));

  Label11.Caption := FormatFloat('0.00', (SectPerCls * BytesPerCls * TotCls)/(1024*1024*1024)) + ' GB';

  Label12.Caption := FormatFloat('0.00', (SectPerCls * BytesPerCls * FreeCls)/(1024*1024*1024)) + ' GB';
...und ShowMessage:

showmessagedlg-1.jpg

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Laufwerkgrössen ermitteln

  Alt 23. Okt 2021, 18:21
Das sucht man auch nicht im Delphi, sondern beim Hersteller.
MSDN-Library durchsuchenGetDiskFreeSpace
MSDN-Library durchsuchenGetDiskFreeSpaceEx

Und wenn eine API noch nicht im Delphi drin ist, dann entweder einen fremden API-Header suchen (z.B. JEDI)
oder einfach selbermachen ... steht ja beim Hersteller, wie es aussehen muß. (braucht man nur noch von C++ nach Pascal/Delphi zu übersetzen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#13

AW: Laufwerkgrössen ermitteln

  Alt 23. Okt 2021, 19:24
Inzwischen hab ich auch noch weiter gesucht, auch in Sachen Bit&Byte-Umrechnung und versucht, mit der gefundenen Demo auf 'einen grünen Zweig' zu kommen.
Das Problem der Demo ist: Altes Delphi und (vor allem) alte API-Funktionen, die nur bei Werten bis 2 GB richtig arbeiten. Alles, was über den Maximalwert von Integer (2147483647) hinausgeht, scheitert. Und durch diverse Überläufe beim Umgang, rechnen, ... mit diesen Werten, kommen mehr oder weniger (realitätsferne, kaum nachvollziehbare Pseudo-) Zufallswerte dabei heraus.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Laufwerkgrössen ermitteln

  Alt 23. Okt 2021, 21:57
Hi zusammen

In Sachen GetDiskFreeSpaceEx hab ich noch ganz was interessantes gefunden

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Laufwerkgrössen ermitteln

  Alt 23. Okt 2021, 22:49
Zitat:
Delphi-Quellcode:
if UsedSpace > 0 then
  UsedSpace := ...
Irgendwie sieht das bissl falschrum aus.

Ich würde ja denken "wenn es fehlt, dann berechnen"


Und bei den Schweizern .... Warum vergessen eigentlich immer alle die Rückgabewerte von Funktionen auszuwerten?
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 blawen
blawen
Online

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
654 Beiträge
 
Delphi 12 Athens
 
#16

AW: Laufwerkgrössen ermitteln

  Alt 23. Okt 2021, 23:32
Warum vergessen eigentlich immer alle die Rückgabewerte von Funktionen auszuwerten?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  free_size, total_size: Int64;
begin
  if GetDiskSize(DriveComboBox1.Drive, free_size, total_size) then
    ShowMessage('free space =' +
      IntToStr(free_size) + #13 + 'total size=' +
      IntToStr(total_size))
  else
    ShowMessage('No disk in drive!');
end;
Ist doch drin - oder?
(Abgesehen davon, dass ich dieses Beispiel nicht wirklich "schön" finde)
Roland
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Laufwerkgrössen ermitteln

  Alt 23. Okt 2021, 23:43
ähhhhmmm nein?

Zitat:
Delphi-Quellcode:
  begin
    GetDiskFreeSpaceEx(RootPtr, Free_size, Total_size, nil);
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 blawen
blawen
Online

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
654 Beiträge
 
Delphi 12 Athens
 
#18

AW: Laufwerkgrössen ermitteln

  Alt 24. Okt 2021, 01:58
ähhhhmmm nein?
Es gibt zwei Funktionen, die eine wird ausgewertet, die andere hingegen nicht.
Roland

Geändert von blawen (24. Okt 2021 um 02:01 Uhr)
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
103 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Laufwerkgrössen ermitteln

  Alt 24. Okt 2021, 14:26
Hi himitsu
Ich denke eher mal deine Schleife ist falsch.
Sorry, das ist nicht mein Code, sondern der stammt von hier.
Der eigentliche Fehler steckt in Deinem Code:
"i" iteriert über die Elemente des Arrays, und diesen Index übergibst Du an DiskFree(i):
Delphi-Quellcode:
  Result := TDirectory.GetLogicalDrives;
  for i:=Low(Result) to High(Result) do
  begin
    Result[i] := GetOneDrive(Result[i]);
    space := DiskFree(i); <-- falscher Parameter!
Du musst aber die Nummer des Laufwerks übergeben, wobei 1=A, 2=B usw. bedeutet. Also den Inhalt des Arrayelements an der Stelle "i", und nicht "i" selber:
Delphi-Quellcode:
LDrive := Ord(Result[i][1]) - Ord('A') + 1;
space := DiskFree(LDrive);
.
Oder aber direkt GetDiskFreeSpaceEx(Result[i], Space, ...) verwenden. Diese API-Funktion arbeitet direkt mit Laufwerksbuchstaben bzw. Ordnernamen.
Achim
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Laufwerkgrössen ermitteln

  Alt 29. Okt 2021, 20:32
Hi zusammen

Ich habe hier ein Beispiel für GetDiskFreeSpaceEx gefunden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var freeCaller, total: Int64;
begin
  GetDiskFreeSpaceEx('C:', freeCaller, total, nil);
  label1.caption:='Freier Speicher: '+IntToStr(freeCaller)+' Bytes';
  label2.caption:='Gesamter Speicher: '+IntToStr(total)+' Bytes';
end;
Das funktioniert einwandfei, wenn ich es so wie gesehen in einen Buttonklick-Event packe. Die Probleme beginnen erst später.

Meine derzeitiger Umsetzungsversuch:


Delphi-Quellcode:
function TPopUpWindow.DedectBiggestFreeSpace: Char;
  var i :integer; PopupWindow: TPopupWindow;
begin
  PopupWindow := TPopupWindow.Create(Self);
  PopupWindow.PopupMode := pmExplicit;
  PopupWindow.PopupParent := HomeOfficerFeMain;
  PopupWindow.RzPageControl1.ActivePage := PopupWindow.RzPageControl1.Pages[0];
  PopUpWindow.Position := poMainFormCenter;
  PopUpWindow.GetAllDrives;
end;

function TPopUpWindow.GetAllDrives: TStringDynArray;
  var total, freeCaller: int64; i: Integer;
      UsedSpace, TotalSpace, DriveLetter,
      FreeSpace, Space: String; DrivesArray : TStringDynArray;
begin
  DrivesArray := TDirectory.GetLogicalDrives; //Result enthält all Laufwerke, auch die Partitionen
  for i:=Low(DrivesArray) to High(DrivesArray) do
  begin
    DriveLetter := GetOneDrive(DrivesArray[i]);
    GetDiskNumbers(DriveLetter);
  end;
end;

function TPopUpWindow.GetOneDrive(const Drive: string): string;
  {Returns the display name for the drive with the given root path.}
  var FI: TSHFileInfo; // info about drive
begin
  if ShellAPI.SHGetFileInfo(PChar(Drive), 0, FI, SizeOf(FI),
     ShellAPI.SHGFI_DISPLAYNAME ) = 0 then
     RaiseLastOSError;
     Result := FI.szDisplayName;
end;
Und schliesslich GetDiskNumbers:

Delphi-Quellcode:
procedure TPopUpWindow.GetDiskNumbers(DriveLetter: String);
  var freeCaller, total : Int64; Freespace, Totalspace, UsedSpace :String;
begin
  GetDiskFreeSpaceEx(PChar(DriveLetter), freeCaller, total, nil);
  LbxVolumen.Items.Add('Disk: '+ DriveLetter);
  LbxVolumen.Items.Add('Freier Speicher: '+IntToStr(freeCaller)+' Bytes');
  LbxVolumen.Items.Add('Gesamter Speicher: '+IntToStr(total)+' Bytes');
  LbxVolumen.Items.Add('----');
  LbxVolumen.Items.Add('Freier Speicher: ' + FormatFloat('000.00', (freeCaller)/(1024*1024*1024)) + ' GB');
  LbxVolumen.Items.Add('Gesamter Speicher: ' + FormatFloat('0.00', (total)/(1024*1024*1024)) + ' GB');
  LbxVolumen.Items.Add('--------------------');
end;

Im gegenzug nach dem Beispiel von Delphitreff:

Delphi-Quellcode:
procedure TPopUpWindow.Button1Click(Sender: TObject);
var freeCaller, total: Int64;
begin
  GetDiskFreeSpaceEx('C:', freeCaller, total, nil);
  label1.caption:='Freier Speicher: '+IntToStr(freeCaller)+' Bytes';
  label2.caption:='Gesamter Speicher: '+IntToStr(total)+' Bytes';
end;
Hier ist nichts anders mit Ausnahme der Variablen DriveLetter und der Format-Anweisung. Trotzdem funktioniert mein Code nicht:
drivepopup3.jpg

Was mache ich falsch? Die Formatumrechnung in Gigabyte ist ziemlich der des Explorers und sogar noch genauer.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 00:00 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