AGB  ·  Datenschutz  ·  Impressum  







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

GetLogicalDrives und DiskSize/DiskFree

Ein Thema von Willie1 · begonnen am 22. Jan 2025 · letzter Beitrag vom 24. Jan 2025
Antwort Antwort
Willie1

Registriert seit: 28. Mai 2008
691 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

GetLogicalDrives und DiskSize/DiskFree

  Alt 22. Jan 2025, 19:35
Hallo,
weg vom blöden Norton:

GetLogicalDrives liefert die Buchstaben der wirklich vorhandenen Laufwerke.
Bei mir z.B. C:\ (Windows), D:\ (Recovery), E:\ (ext. Festplatte), K:\ (USB-Stick).

DiskSize und DiskFree(Zahl: Byte) liefert für alle Laufwerke 1-25) .. (u.a. USB-Anschlüsse) -1 zurück, wenn nichts angeschlossen ist aber auch, wenn sie gar nicht vorhanden sind. 0 = aktuelles Lw.

Meine Frage: kann ich zunächst GetLogicalDrives benutzen und dann mit Ord(Laufwerkbuchstabe)-64 Größe und freien Speicherplatz ermitteln? Ich habe 8 USB-Anschlüsse, die alle einen festen Buchstaben haben Ist das immer so? A und B (Disketten) gibt es nicht mehr, das weiß ich.

Gruß Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.791 Beiträge
 
Delphi 12 Athens
 
#2

AW: GetLogicalDrives und DiskSize/DiskFree

  Alt 22. Jan 2025, 20:44
DiskSize und DiskFree(Zahl: Byte) liefert für alle Laufwerke 1-25) .. (u.a. USB-Anschlüsse) -1 zurück, wenn nichts angeschlossen ist aber auch, wenn sie gar nicht vorhanden sind. 0 = aktuelles Lw.
Du kannst mit GetDriveType prüfen, was hinter dem Laufwerksbuchstaben steckt:
GetDriveType

Meine Frage: kann ich zunächst GetLogicalDrives benutzen und dann mit Ord(Laufwerkbuchstabe)-64 Größe und freien Speicherplatz ermitteln?
Ja, aber du solltest nach Typ unterscheiden.

Ich habe 8 USB-Anschlüsse, die alle einen festen Buchstaben haben Ist das immer so? A und B (Disketten) gibt es nicht mehr, das weiß ich.
Windows versucht, Laufwerksbuchstaben für das gleiche externe Laufwerk beim erneuten Anschluss erneut identisch zuzuweisen. Wird ein Laufwerk neu angeschlossen, wird ein Laufwerksbuchstabe neu vergeben.

Du kannst auch problemlos die Buchstaben A und B für Festplatten verwenden. Das habe ich auch schon gemacht, als ich nicht genügend andere Buchstaben mehr hatte.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#3

AW: GetLogicalDrives und DiskSize/DiskFree

  Alt 23. Jan 2025, 18:01
Nur als zusätzliche Idee, warum verwendest du nicht die WMI Abfragen. Ich habe nur kurz nachgeschaut, also mit "WMI Win32_DiskDrive" bekommst du alle physikalischen Laufwerke, die Grösse und ob es ein USB Laufwerk ist. Und über "Win32_DiskDriveToDiskPartition" in Verbindung mit "Win32_LogicalDiskToPartition" bekommst du dann die zugehörigen Laufwerksbuchstaben.
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
691 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: GetLogicalDrives und DiskSize/DiskFree

  Alt 23. Jan 2025, 19:17
Hallo,

ich habe mir was zusammen gebastelt, was funktioniert. Netzwerklaufwerk habe ich noch nicht ausprobiert Als Nerd fällt mir auf, dass Windows den Laufwerkbuchstaben ziemlich willkürlich vergibt. der eine USB-Stick hört auf G: , ein anderer am selben Anschluss auf K: . Wie gesagt, ich habe 8 USB's und noch den Kartenleser., der auch einen Buchstaben bekommt.

Ich muss bekennen, von WMI habe ich keine Ahnung. Ich habe mit eurer Hilfe mal Windows 11 mit dem alten Delphi 10 über WMI ermittelt. Das war's schon. Das aktuelle Delphi macht das ja direkt richtig.

Gruß Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (23. Jan 2025 um 19:23 Uhr)
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#5

AW: GetLogicalDrives und DiskSize/DiskFree

  Alt 24. Jan 2025, 23:41
also ich muß zugeben, dass ich auch nicht der WMI Profi bin, aber als Ausgangspunkt verwende ich gerne für die WMI Quellcode Erzeugung den WMI Delphi Code Creator von der The Road to Delphi Seite(siehe auch angehängtes Foto). Die aktuelle Version findest du hier.
Der erzeugte Sourcecode von WMI Delphi Code Creator ist meist schon lauffähig. Der Quellcode von Button1 bis Button3 wurde mit dem WMI Delphi Code Creator erzeugt und geringfügig angepaßt. Ich denke, dass du mit den Infos theoretisch die Daten selber zusammenfügen kannst.

Als Bonus habe ich zufälliger Weise für die Zuordnung der Laufswerksbuchstaben ein funktionierendes Beispiel wieder von der The Road to Delphi Seite gefunden und in Button4 eingebaut.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    function getString( value: OLEVariant ): String;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
    oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Caption %s',[getString(FWbemObject.Caption)]));// String
      Memo1.Lines.Add(Format('DeviceID %s',[getString(FWbemObject.DeviceID)]));// String
      Memo1.Lines.Add(Format('Index %s',[getString(FWbemObject.index)]));// String
      Memo1.Lines.Add(Format('InterfaceType %s',[getString(FWbemObject.InterfaceType)]));// Array of String
      Memo1.Lines.Add(Format('MediaType %s',[getString(FWbemObject.MediaType)]));// Array of String
      Memo1.Lines.Add(Format('Model %s',[getString(FWbemObject.Model)]));// String
      Memo1.Lines.Add(Format('SerialNumber %s',[getString(FWbemObject.SerialNumber)]));// String
      Memo1.Lines.Add(Format('Size %s',[getString(FWbemObject.Size)]));// Uint64
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition','WQL',wbemFlagForwardOnly);
    oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Antecedent %s',[String(FWbemObject.Antecedent)]));// String
      Memo1.Lines.Add(Format('Dependent %s',[String(FWbemObject.Dependent)]));// String
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin;
  CoInitialize(nil);
  try
    FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
    FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
    FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition','WQL',wbemFlagForwardOnly);
    oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
    while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      Memo1.Lines.Add(Format('Antecedent %s',[String(FWbemObject.Antecedent)]));// String
      Memo1.Lines.Add(Format('Dependent %s',[String(FWbemObject.Dependent)]));// String
      Memo1.Lines.Add('------------------------------------------');
      FWbemObject:=Unassigned;
    end;
  finally
    CoUninitialize;
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
{
  ursprüngliche Quelle: https://theroadtodelphi.com/2011/10/25/wmi-tasks-using-delphi-%E2%80%93-disks-and-file-systems/
}

const
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  wmiDiskDrives : OLEVariant;
  wmiDiskPartitions : OLEVariant;
  wmiLogicalDisks : OLEVariant;
  wmiDiskDrive : OLEVariant;
  wmiDiskPartition : OLEVariant;
  wmiLogicalDisk : OLEVariant;
  oEnum : IEnumvariant;
  oEnum2 : IEnumvariant;
  oEnum3 : IEnumvariant;
  iValue : LongWord;
  DeviceID : string;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
  //Get the physical disk drive
  wmiDiskDrives := FWMIService.ExecQuery('SELECT Caption, DeviceID FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
  oEnum := IUnknown(wmiDiskDrives._NewEnum) as IEnumVariant;
  while oEnum.Next(1, wmiDiskDrive, iValue) = 0 do
  begin
     //Use the disk drive device id to find associated partition
     DeviceID:=StringReplace(String(wmiDiskDrive.DeviceID),'\','\\',[rfReplaceAll]);
     wmiDiskPartitions := FWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="'+DeviceID+'"} WHERE AssocClass = Win32_DiskDriveToDiskPartition','WQL',wbemFlagForwardOnly);
     oEnum2 := IUnknown(wmiDiskPartitions._NewEnum) as IEnumVariant;
     while oEnum2.Next(1, wmiDiskPartition, iValue) = 0 do
     begin
        wmiLogicalDisks := FWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+String(wmiDiskPartition.DeviceID)+'"} WHERE AssocClass = Win32_LogicalDiskToPartition','WQL',wbemFlagForwardOnly);
        oEnum3 := IUnknown(wmiLogicalDisks._NewEnum) as IEnumVariant;
        while oEnum3.Next(1, wmiLogicalDisk, iValue) = 0 do
        begin
          Memo1.Lines.Add(Format('Drive letter associated with disk drive %s %s Partition %s is %s',[String(wmiDiskDrive.Caption),String(wmiDiskDrive.DeviceID),String(wmiDiskPartition.DeviceID),String(wmiLogicalDisk.DeviceID)]));
          wmiLogicalDisk:=Unassigned;
        end;
       wmiDiskPartition:=Unassigned;
     end;
    wmiDiskDrive:=Unassigned;
  end;
end;

function TForm1.getString( value: OLEVariant ): String;
begin
  if VarIsNull( value ) then result := ''
  else result := String( value );
end;

end.
Miniaturansicht angehängter Grafiken
delphiwmicodecreator.jpg  
Angehängte Dateien
Dateityp: zip WMIDiskdrives.zip (5,8 KB, 6x aufgerufen)

Geändert von jus (25. Jan 2025 um 00:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 04:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz