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 1 von 3  1 23      
Delbor

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

Laufwerkgrössen ermitteln

  Alt 21. Okt 2021, 12:58
Delphi-Version: 11 Alexandria
Hi zusammen

Mit folgendem Code (/von hier) ermittle ich meine Laufwerke und deren freien Speicher:


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 i: Integer; space : Int64;
begin
  Result := TDirectory.GetLogicalDrives;
  for i:=Low(Result) to High(Result) do
  begin
    Result[i] := GetOneDrive(Result[i]);
    space := DiskFree(i);
    RzRadioGroup1.Items.Add(Result[i] +' -- ' + Inttostr(space));
  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 so sieht das dann aus:
laufwerke-13_38_03-window.jpg

Der Grund dafür: DiskFree liefert –1, wenn die Laufwerksnummer ungültig ist.

Und nun? Wie geht es verünftig weiter?

Gruss
Delbor

PS: Ich denk, ich hab eine Teilantwort gefunden: D: und E: sind Partitionen auf F:.
Der User soll mit diesem Dialog einen Speicherort für eine Anwendungsgebundene SQLite-DB festlegen.
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (21. Okt 2021 um 13:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Laufwerkgrössen ermitteln

  Alt 21. Okt 2021, 16:33
Wie kann die Laufwerksnummer der Laufwerksbuchstabe ungültig sein, wenn es doch vorhanden sein soll?
Wenn es nicht da ist, dann stimmt die Rückgabe ja.

Natürlich kann man auch direkt MSDN-Library durchsuchenGetDiskFreeSpaceEx benutzen, aber von der Rückgabe her macht es keinen Unterschied.


ABER:


Ich denke eher mal deine Schleife ist falsch.
Nicht von Low to High, sondern nur durch das, was in dem Set drin steckt.

Und hier stimmt der Index i des Arrays nunmal garnicht mit dem Laufwerksindize überein.

* Entweder du nimmst dir den Laufwerksburchstaben und rechnest ihn in einen Index um (Ord(Result[i][1]) - Ord('A') )
* oder du nimmst eine Funktion, welcher du direkt das laufwerk geben kannst, z.B. MSDN-Library durchsuchenGetDiskFreeSpaceEx (allerdings ohne den \ , wenn ich mich richtig erinnere)
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
 
#3

AW: Laufwerkgrössen ermitteln

  Alt 21. Okt 2021, 17:03
Wie kann die Laufwerksnummer der Laufwerksbuchstabe ungültig sein, wenn es doch vorhanden sein soll?
Diskettenlaufwerk, CD- oder DVD-Laufwerk oder sonstige Wechsellaufwerke ohne Datenträger haben alle einen Laufwerksbuchstaben.

Ohne eingelegten Datenträger scheitern aber DiskFree und Co.
  Mit Zitat antworten Zitat
ol1uw

Registriert seit: 24. Jul 2004
Ort: Freiberg
68 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Laufwerkgrössen ermitteln

  Alt 21. Okt 2021, 19:48
Hallo

So ähnlich hatte ich das vor Jahren mal gemacht da meine zusätzlichen Festplatten alle in Verzeichnissen bereit gestellt werden
und die meisten Tools so etwas nicht anzeigen.

Erstellt mit Hilfe von Wmi Delphi Code Creator (WDCC)

Delphi-Quellcode:
// -----------------------------------------------------------------------------------------------------
// This code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.9.9.482
// http://code.google.com/p/wmi-delphi-code-creator/
// Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/
// Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2015
// -----------------------------------------------------------------------------------------------------
//
// LIABILITY DISCLAIMER
// THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
// YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
// DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//
// ----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Windows,
  Variants;



// Die Klasse "Win32_Volume" stellt einen Speicherbereich auf einer Festplatte
// dar. Die Klasse gibt lokale Volumes wieder, die formatiert, unformatiert,
// bereitgestellt oder offline sind. Ein Volume wird unter Verwendung eines
// Dateisystems, wie z. B. FAT oder NTFS, formatiert, und dem Volume kann eine
// Laufwerkbuchstabe zugewiesen werden. Eine einzelne Festplatte kann mehrere
// Volumes enthalten, und Volumes können über mehrere Datenträger übergreifen. Die
// Klasse "Win32_Volume" unterstützt die Diskettenlaufwerkverwaltung nicht.

procedure GetWin32_VolumeInfo;
const
  WbemUser = '';
  WbemPassword = '';
  WbemComputer = 'localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator: OLEVariant;
  FWMIService: OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject: OLEVariant;
  oEnum: IEnumvariant;
  iValue: LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet := FWMIService.ExecQuery('SELECT * FROM Win32_Volume', 'WQL', wbemFlagForwardOnly);
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumvariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin

    if pos(':', String(FWbemObject.Name)) > 0 then
    begin
      Writeln(Format('Name %s', [String(FWbemObject.Name)])); // String
      Writeln(Format('FileSystem %s', [String(FWbemObject.FileSystem)])); // String
      Writeln(Format('Capacity %d', [int64(FWbemObject.Capacity)])); // Uint64
      Case Integer(FWbemObject.DriveType) of
        DRIVE_UNKNOWN:
          Writeln('DriveType Unknown');
        DRIVE_REMOVABLE:
          Writeln('DriveType Removable');
        DRIVE_FIXED:
          Writeln('DriveType Fixed');
        DRIVE_REMOTE:
          Writeln('DriveType Network');
        DRIVE_CDROM:
          Writeln('DriveType CD-ROM');
        DRIVE_RAMDISK:
          Writeln('DriveType RAM Disk');
      end;
      Writeln(Format('FreeSpace %d', [int64(FWbemObject.FreeSpace)])); // Uint64
      Writeln('-------------------------------------------------------');
    End;
    FWbemObject := Unassigned;
  end;
end;

begin
  try
    CoInitialize(nil);
    try
      GetWin32_VolumeInfo;
    finally
      CoUninitialize;
    end;
  except
    on E: EOleException do
      Writeln(Format('EOleException %s %x', [E.Message, E.ErrorCode]));
    on E: Exception do
      Writeln(E.Classname, ':', E.Message);
  end;
  Writeln('Press Enter to exit');
  Readln;

end.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Laufwerkgrössen ermitteln

  Alt 21. Okt 2021, 20:45
Ohne eingelegten Datenträger scheitern aber DiskFree und Co.
Aber da ist es auch vollkommen OK, wenn diese Funktion sagt "hier gibt's nichts zu sehn".

Wer unbedingt 0 will, kann auch gern ein Max einfügen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delbor

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

AW: Laufwerkgrössen ermitteln

  Alt 21. Okt 2021, 23:30
Hi himitsu
Wie kann die Laufwerksnummer der Laufwerksbuchstabe ungültig sein, wenn es doch vorhanden sein soll?
Die Seite des Emba-Wikkis spricht aber von einer Laufwerksnummer, nicht vom Laufwerksbuchstaben. Und eigentlich sollte klar sein, dass eine Partition keine eigene Laufwerksnummer haben kann.
ABER:


Ich denke eher mal deine Schleife ist falsch.
Sorry, das ist nicht mein Code, sondern der stammt von hier. Ich habe ihn lediglich noch etwas nach dieser Vorlage ergänzt.

Nicht von Low to High, sondern nur durch das, was in dem Set drin steckt.

Und hier stimmt der Index i des Arrays nunmal garnicht mit dem Laufwerksindize überein.
Von welchem Set? Oder von welchem Array? Sicher vom TStringDynArray.
Kann es sein, dass Diskfree nur Nummer und die Grösse des freien Speichers von Laufwerken ermitteln kann, nicht aber von Partitionen?

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.136 Beiträge
 
Delphi 12 Athens
 
#7

AW: Laufwerkgrössen ermitteln

  Alt 22. Okt 2021, 02:27
Ja, das ist bissl verwirrend, aber auch recht einfach.

Laufwerke haben zwar eine ID (GUID), aber diese Laufwerksnummer hier ist einfach nur stumpf durchgezählt ... ich denke mal, das ist noch ein Überbleibsel aus DOS.


A = 0
B = 1
C = 2
usw.
Code:
* das Laufwerk
    * dein I
      * der richtige Index
C:\ 0 2
D:\ 1 3
E:\ 2 4
S:\ 3 18

Chr(i+64) entspricht einem Chr(i + Ord('A')) (binär ist es das Selbe ... nur das eine ist etwas Verständlicher)
und siehe oben, andersrum kann man auch aus einem Laufwerksbuchstaben die Laufwerksnummer berechnen, also Ord(C) - Ord('A') .

Wofür die Nummer allerdings gut ist, das sieht man an MSDN-Library durchsuchenGetLogicalDrives, weches ein DWORD zurückgibt, bzw. quasi ein set of 0..31 .
Aber als set of 'A'..'Z' (eigentlich set of 'A'..'`' , da ja mehr Felder, als Buchstaben), wäre es wieder verständlicher gewesen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Okt 2021 um 11:44 Uhr)
  Mit Zitat antworten Zitat
Delbor

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

AW: Laufwerkgrössen ermitteln

  Alt 22. Okt 2021, 13:39
Hi zusammen

Vor einiger Zeit hab ich auch das noch gefunden und hab mir die Demo dazu gleich mal gedownloaded. Die Grössenangaben zu einer ausgewählten Disk stimmen allerdings nicht im entferntesten. Nachvollziehen, wieso das so ist, konnte ich bislang nicht.

Im Moment komme ich jedenfalls keinen Schritt weiter.

Gruss
Delbor
Miniaturansicht angehängter Grafiken
14_22_32-vol_info-delphi-10.4-main-%5Bwird-ausgefuehrt%5D-%5Berzeugt%5D.jpg  
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
Delphi.Narium

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

AW: Laufwerkgrössen ermitteln

  Alt 22. Okt 2021, 14:37
Es dürfte sich um ein Festplatte mit ca. 4 TB handeln.

Fraglich ist halt, ob man zur Berechnung die

1. Variante
1 kb = 1024 Byte
1 mb = 1024 kb
1 gb = 1024 mb
1 tb = 1024 gb

oder die

2. Variante
1 kb = 1000 Byte
1 mb = 1000 kb
1 gb = 1000 mb
1 tb = 1000 gb

nutzt.

Das von Dir gefundene Programm nutzt die zweite Variante und die Abweichungen gegenüber der ersten sind im Terrabytebereich dann schon mal nicht eben so ganz unerheblich.

Statt
Delphi-Quellcode:
  Label11.Caption := FormatFloat('0.00', (SectPerCls * BytesPerCls *
                                          TotCls)/1000000) + ' MB';
  Label12.Caption := FormatFloat('0.00', (SectPerCls * BytesPerCls *
                                          FreeCls)/1000000) + ' MB';
mal mit
Delphi-Quellcode:
  Label11.Caption := FormatFloat('0.00', (SectPerCls * BytesPerCls *
                                          TotCls) / (1024 * 1024)) + ' MB';
  Label12.Caption := FormatFloat('0.00', (SectPerCls * BytesPerCls *
                                          FreeCls) / (1024 * 1024)) + ' MB';
probieren. Entsprechen die Ergebnisse dann eher Deinen Vorstellungen?

Das Betriebssysteme nutzt die erste Variante.
Festplattenhersteller nutzen für die Kapazitätsangaben gerne die zweite Variante.

Durch diesen "Rechenunterschied" hat eine 1 TB-Platte mit Herstellerangaben nach Variante 2 beim Betriebssystem dann "nur noch" eine Kapazität von 909,49 GB.
Bei einer 4 TB-Platte bleiben dann "nur noch" 3,64 TB übrig (ergibt eine Abweichung von etwa 9%).

Zitat von Delbor:
Die Grössenangaben zu einer ausgewählten Disk stimmen allerdings nicht im entferntesten.
Bechreib' doch einfach mal, was Du erwartest und was angezeigt wird.
Hätte den Vorteil, dass man eine Vorstellung vom Fehler (und seiner Größenordnung) bekommen könnte.
  Mit Zitat antworten Zitat
Delbor

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

AW: Laufwerkgrössen ermitteln

  Alt 22. Okt 2021, 15:41
Hi Delphi.Narium

Es dürfte sich um ein Festplatte mit ca. 4 TB handeln.
Ich geh mal davon aus, dass du dich auf die obige Abbildung des Programms und die Auswahl von "D:\OfficeDisk" beziehst - Besagtes Volume ist eine Partition mit einer Gesamtgrösse von 24.9 GB und befindet sich eigentlich auf "F:\DatabaseDisk" (2TB); Eine weitere Partition ist "E:\Developerdisk" mit einer Grösse von 149 GB, ebenfalls auf "F:\".

@himitsu:
Delphi-Quellcode:
* das Laufwerk
    * dein I
      * der richtige Index
C:\ 0 2
D:\ 1 3
E:\ 2 4
S:\ 3 18
Wenn ich das richtig interpretiere, sollte ich das Array zB. mit einer Whileschleife durchlaufen können und erst ab dem 2.Index reagieren. Soweit nicht wirklich unverständlich - das letzte Element bliebe so oder so nach diesem Beispiel Laufwerk S.
Die Sache scheint mir aber einen Haken zu haben: Die Laufwerke, die statt einer Grössenangabe ein '-1' ausweisen, befinden sich so oder so mitten im Array.

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 1 von 3  1 23      


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 09:35 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