Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Laufwerkgrössen ermitteln (https://www.delphipraxis.net/209071-laufwerkgroessen-ermitteln.html)

Delbor 23. Okt 2021 18:15

AW: Laufwerkgrössen ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 3)
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:
Anhang 54541
Anhang 54540
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:

Anhang 54542

Gruss
Delbor

himitsu 23. Okt 2021 18:21

AW: Laufwerkgrössen ermitteln
 
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)

Delphi.Narium 23. Okt 2021 19:24

AW: Laufwerkgrössen ermitteln
 
Zitat:

Zitat von Delbor (Beitrag 1496515)
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.

Delbor 23. Okt 2021 21:57

AW: Laufwerkgrössen ermitteln
 
Hi zusammen

In Sachen GetDiskFreeSpaceEx hab ich noch ganz was interessantes gefunden

Gruss
Delbor

himitsu 23. Okt 2021 22:49

AW: Laufwerkgrössen ermitteln
 
Zitat:

Delphi-Quellcode:
if UsedSpace > 0 then
  UsedSpace := ...

Irgendwie sieht das bissl falschrum aus.

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


Und bei den Schweizern .... Warum vergessen eigentlich immer alle die Rückgabewerte von Funktionen auszuwerten?

blawen 23. Okt 2021 23:32

AW: Laufwerkgrössen ermitteln
 
Zitat:

Zitat von himitsu (Beitrag 1496526)
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)

himitsu 23. Okt 2021 23:43

AW: Laufwerkgrössen ermitteln
 
ähhhhmmm nein?

Zitat:

Delphi-Quellcode:
  begin
    GetDiskFreeSpaceEx(RootPtr, Free_size, Total_size, nil);


blawen 24. Okt 2021 01:58

AW: Laufwerkgrössen ermitteln
 
Zitat:

Zitat von himitsu (Beitrag 1496530)
ähhhhmmm nein?

Es gibt zwei Funktionen, die eine wird ausgewertet, die andere hingegen nicht.

Achim Kalwa 24. Okt 2021 14:26

AW: Laufwerkgrössen ermitteln
 
Zitat:

Zitat von Delbor (Beitrag 1496457)
Hi himitsu
Zitat:

Zitat von himitsu (Beitrag 1496443)
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.

Delbor 29. Okt 2021 20:32

AW: Laufwerkgrössen ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Anhang 54568

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

Gruss
Delbor


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

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