ExamineDrives() - Laufwerkliste mit Infos

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

ExamineDrives() - Laufwerkliste mit Infos

Beitrag von STARGÅTE »

Tachchen,

Vorab danke an TS-Soft für ein paar Codes/Ideen

Ich habe mal das Auslesen von Laufwerken und deren Infos (die ich vllt noch erweitere) in den für PureBasic bekannten Stil gebracht.

Code: Alles auswählen

; Konstanten
#PB_Drive_Removable = 2
#PB_Drive_Fixed     = 3
#PB_Drive_Remote    = 4
#PB_Drive_CDRom     = 5
#PB_Drive_RamDisk   = 6


; Interne Struktur
Structure Drive_PBI
 Path$
 Type.i
 Name$
 Size.q
 Free.q
EndStructure 

; Interne Liste
Global NewList Drive_PBI.Drive_PBI()


; Ermittelt alle Laufwerke und deren Informationen
;  Flag gibt an, ob auch Infos von Wechseldatenträgern ermittelt werden sollen
Procedure ExamineDrives(Flag=#True)
 Protected Drives$ = "", Size
 Protected Bytes, Sectors, TotalClusters, FreeClusters
 ClearList(Drive_PBI())
 Size = GetLogicalDriveStrings_(0, @Drives$) 
 Drives$ = Space(Size) 
 GetLogicalDriveStrings_(Size, @Drives$)
 *Drives = @Drives$
 While Trim(PeekS(*Drives))
  AddElement(Drive_PBI())
  With Drive_PBI()
   \Path$ = Trim(PeekS(*Drives))
   \Type = GetDriveType_(\Path$) 
   If (Flag Or \Type = #PB_Drive_Fixed) 
    \Name$ = Space(#MAX_PATH) 
    If GetVolumeInformation_(\Path$, \Name$, #MAX_PATH, 0, 0, 0, 0, 0) 
     If GetDiskFreeSpace_(\Path$, @Sectors, @Bytes, @FreeClusters, @TotalClusters)
      \Size = TotalClusters * Sectors * Bytes
      \Free = FreeClusters * Sectors * Bytes
     EndIf
    EndIf
    \Name$ = Trim(\Name$)
   EndIf 
   *Drives + StringByteLength(\Path$) + SizeOf(Character) 
  EndWith
 Wend
 ResetList(Drive_PBI())
EndProcedure

; Springt zum nächsten Laufwerk
Macro NextDrive()
 NextElement(Drive_PBI())
EndMacro

; Gibt den Pfad des Laufwerks zurück ("C:\")
Macro DrivePath()
 Drive_PBI()\Path$
EndMacro

; Gibt den Namen des (Fix-)Laufwerks zurück ("BOOT")
Macro DriveName()
 Drive_PBI()\Name$
EndMacro

; Gibt den Typen des Laufwerks zurück (#PB_Drive_Fixed)
Macro DriveType()
 Drive_PBI()\Type
EndMacro

; Gibt den freien Speicherplatz zurück
;  Prefix bestimmt die Einheit: 0 - Byte ; 1 - KiloByte ; 2 - MegaByte ; 3 - GigaByte ; ...
Macro DriveFreeSize(Prefix=0)
 ( Drive_PBI()\Free / Pow(1024, Prefix) )
EndMacro

; Gibt den gesamt Speicherplatz zurück
;  Prefix bestimmt die Einheit: 0 - Byte ; 1 - KiloByte ; 2 - MegaByte ; 3 - GigaByte ; ...
Macro DriveTotalSize(Prefix=0)
 ( Drive_PBI()\Size / Pow(1024, Prefix) )
EndMacro
Hier dann ein Beispiel:

Code: Alles auswählen

ExamineDrives()
While NextDrive()
 Select DriveType()
  Case #PB_Drive_Removable
   Type$ = "Wechseldatenträger"
   Info$ = "  [ "+StrF(DriveFreeSize(2),2)+" MB Frei / "+StrF(DriveTotalSize(2),2)+" MB ]"
  Case #PB_Drive_Fixed
   Type$ = "Festplatte"
   Info$ = "  [ "+StrF(DriveFreeSize(3),2)+" GB Frei / "+StrF(DriveTotalSize(3),2)+" GB ]"
  Case #PB_Drive_Remote
   Type$ = "Netzlaufwerk"
   Info$ = "  [ "+StrF(DriveFreeSize(3),2)+" GB Frei / "+StrF(DriveTotalSize(3),2)+" GB ]"
  Case #PB_Drive_CDRom
   Type$ = "CD/DVD-Laufwerk"
   Info$ = "  [ "+StrF(DriveFreeSize(2),2)+" MB Frei / "+StrF(DriveTotalSize(2),2)+" MB ]"
  Case #PB_Drive_RamDisk
   Type$ = "RAM-Laufwerk"
   Info$ = "  [ "+StrF(DriveFreeSize(2),2)+" MB Frei / "+StrF(DriveTotalSize(2),2)+" MB ]"
  Default 
   Type$ = "Unbekannter Laufwerktyp"
   Info$ = ""
 EndSelect
 Debug Type$+"  ("+DriveName()+")  "+DrivePath()+Info$
Wend
Mögliche Ausgabe dann:
Wechseldatenträger () A:\ [ 0.04 MB Frei / 1.39 MB ]
Festplatte (BOOT) C:\ [ 4.84 GB Frei / 27.95 GB ]
Festplatte (BACKUP) D:\ [ 2.50 GB Frei / 25.03 GB ]
Festplatte (RECOVER) E:\ [ 0.79 GB Frei / 2.92 GB ]
CD/DVD-Laufwerk (G2ADDON1) F:\ [ 0.00 MB Frei / 697.60 MB ]
CD/DVD-Laufwerk () H:\ [ 0.00 MB Frei / 0.00 MB ]
Wechseldatenträger () I:\ [ 782.05 MB Frei / 993.48 MB ]
Festplatte (DATA) Q:\ [ 62.45 GB Frei / 149.05 GB ]
Netzlaufwerk (VAIO) Z:\ [ 26.31 GB Frei / 34.94 GB ]
Zuletzt geändert von STARGÅTE am 08.05.2009 20:13, insgesamt 3-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

sehr nützlich, danke! :allright:
Win11 x64 | PB 6.20
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Das ist nützlicher Code, danke.
Ich finds immer noch schade, das solche SAchen nicht PB nativ möglich sind. Das wäre für die Portierbarkeit von Code noch hilfreich...
Benutzeravatar
HeX0R
Beiträge: 3054
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

und so geht's auch im Unicodemodus:

Code: Alles auswählen

*Drives + StringByteLength(\Path$) + SizeOf(CHARACTER)
PMTheQuick
Beiträge: 630
Registriert: 05.05.2005 19:06

Beitrag von PMTheQuick »

sehr nützlich, ebenfalls danke :) hab gleich mal nen paar laufwerkchen drangehängt, und alles geht! :-) kann ich gut gebrauchen...

Bild

Gruss
PMTheQuick ;-)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Den Unicode Fehler gibts in meinem Original auch nicht. Aber auch die
Stringreservierung von #MAX_PATH ist aus der Luft gegriffen, statt:

Code: Alles auswählen

Drives$ = Space(#MAX_PATH) 
Size = GetLogicalDriveStrings_(#MAX_PATH, @Drives$)
besser mit genau passendem Buffer:

Code: Alles auswählen

Drive$ = ""
Size = GetLogicalDriveStrings_(0, @Drives$)
Drive$ = Space(Size)
Size = GetLogicalDriveStrings_(Size, @Drive$)
Gruß

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

:oops:
oke, sah halt irgendwie komisch aus ... die funktion zweimal zu schreiben ...

habs geändert!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

STARGÅTE hat geschrieben::oops:
oke, sah halt irgendwie komisch aus ... die funktion zweimal zu schreiben ...

habs geändert!
Ist klar, es gibt diverse APIs, denen man einfach einen 0 Byte Buffer
übergibt, dann erhält man von der API die erforderliche Größe.

24 * 4, also #MAX_PATH würde immer reichen, aber meine Variante finde
ich sauberer :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten