VBA-Zugriff auf Volumes

Drives: Festplatten, DVD- und CD-Laufwerke

Der weltgrößte Software-Konzern ist sehr bemüht, einmal eingeführte Regeln und Produkte möglichst nicht abzuschaffen. Deshalb wird die Kluft zwischen überholten und modernen Methoden ständig größer, ebenso wie der enorme Aufwand zu ihrer Überbrückung. Wegen der erdrückenden Markt-Position halten das die Kunden allerdings für normal. Ein Beispiel ist der Begriff Volume (Laufwerk). Während das Speicher-Volume einer Datei für gewöhnliche Linux-AnwenderInnen unwichtig und unbekannt ist, spielt der "Laufwerks-Buchstabe" in Windows-Software und im täglichen Umgang von Windows-AnwenderInnen noch immer eine wichtige Rolle ...
VBA Visual Basic for Applications - Dateisystem
Volumes Volumes (Drives) - Festplatten, CD/DVD. Netzlaufwerke, ...
Konsolen-Befehle Befehle und Programme zur Volume-Verwaltung
ActiveX Volume-Verwaltung mit VBA (Javascript, ...)
DLL Volume-Verwaltung mit Teilen von Programm-Bibliotheken
ChDrive Volume des aktuellen Pfades wechseln

Volumes

Laufwerke

Volumes sind logische Einheiten, die an physikalische Einheiten ('Laufwerke') gebunden sein können.

Die meisten Datei-Systeme verwenden den Begriff "Volume".
Nur auf M$ Systemen hat er jedoch eine wichtige Bedeutung.

Festplatte

Im einfachsten Fall wird eine Festplatte als Einheit formatiert und steht im Dateisystem als "Drive" zur Verfügung.

DVD / CD

Drives für solche Datenträger verhalten sich ähnlich wie Festplatten, jedoch mit auswechselbarem (removeable) Inhalt.

Partitionierung

Ein Laufwerk (Festplatte, CD, ...) kann in mehrere logische Einheiten (Partitionen) unterteilt werden. Das war wegen der begrenzten Kapazität älterer Dateisysteme notwendig, ist jedoch bei modernen Dateisystemen obsolet.

Wenn sie sich gegen Hardware-Fehler absichern wollen, dann verwenden sie 2 verschiedene reale Festplatten, nicht eine partionierte Platte. Installieren sie auf beiden Festplatten ein Betriebssystem - Das bietet recht gute Sicherheit gegen Ausfälle.

Netzlaufwerk

Seit der Verbreitung lokaler Netzwerke (LANs) ist es üblich, Bereiche des Dateisystems im LAN freizugeben.
Ein oder mehrere Datei-Server (file-server) bieten Verzeichnisse samt Inhalt zur Verwendung im LAN an.
Wer die Wahl hat, setzt einen Linux-Server (LAMP) ein und verwendet die kostenlose Linux Standard-Software Samba als Datei-Server für alle PC, gleich welchen betriebssystems.

Auch Windows-(Arbeits)-PC können Verzeichnisse als Mini-Dateiserver freigeben. Davon wird allerdings abgeraten. Eine zentrale Verwaltung gemeinsam genutzter Daten ist unbedingt vorzuziehen. Außerdem ist die Verwaltung der Zugangs-Rechte auf Windows kompliziert und nicht so ausgereift wie auf Linux.
Alle dazu berechtigten PC (im LAN) können die freigegebenen Verzeichnisse (Shares) als Clients im eigenen Dateisystem verwenden. Windows-PC müssen jedes Share als Netzlaufwerk einbinden (mounten). Ein eingebundenes Netzlaufwerk verhält sich (je nach Server-Konfiguration) wie eine Festplatte oder wie ein DVD / CD-Laufwerk.

Directory

Volumes enthalten ein Inhaltsverzeichnis (directory) und fast beliebig viele Verzeichnisse & Dateien.

Linux
Moderne Linux-Dateisysteme sind nicht an Volumes gebunden: Das Dateisystem kann je nach AnwenderIn und Bedarf aus beliebig vielen lokalen und entfernten Laufwerken zusammengestellt werden.
Ein Verzeichnis (lokal oder entfernt) kann an einer oder mehreren beliebigen Stellen in das Datei-Verzeichnis eingehängt werden.
Für normale Anwendungen ist das Volume unerheblich und seine Kenntnis nicht notwendig.

Laufwerks-Buchstaben

Volumes werden seit MS-DOS in allen bisherigen M$-Betriebssystemen mit Großbuchstaben bezeichnet.
Die Buchstaben A und B sind mit speziellen Eigsnschaften für Disketten reserviert, obwohl diese mittlerweile nicht mehr verwendet werden.
Seit der Ausbreitung lokaler Netzwerke (LANs) ist es üblich, zahlreiche Server-Laufwerke (Festplatten, CDs, ...) im Netzwerk freizugeben. Damit ist der Vorrat an Laufwerks-Buchstaben (26) schnell erschöpft.
Auch in neuen M$-Systemen sind offenbar nur 31 Volumes vorgesehen.
Alle modernen Betriebssysteme verwenden (beliebige und beliebig viele) Namen statt Buchstaben.
Eine eigenartige M$ Empfehlung lautet, zusätzliche Volumes nach Verbrauch aller Laufwerks-Buchstaben ohne Buchstaben einzubinden. Das stößt in der Praxis allerdings auf Probleme, da fast jede Win-Software an die lästigen Buchstaben gekettet ist.

System-Befehle (Konsolen-Programme)

Shell
Einige Windows Hilfsprogramme dienen zur Verwaltung von Volumes.
Mit der VBA-Funktion Shell können u.a. auch Konsolen-Programme ausgeführt werden.
Testen sie jeden Befehl in einem Konsolen-Fenster (cmd.exe), bevor sie versuchen, ihn mit VBA Shell auszuführen.
Die angeführten Befehle und Programme sind unverbindliche Beispiele. Je nach System und Version können die Befehle anders lauten oder andere Optionen verwenden.

Die meisten brauchbaren Programme finden sie in C:\Windows/System32 sowie in Toolkit-Sammlungen, z.B.
Windows Server 2003 Resource Kit Tools , usw.
Sehen sie sich die integrierte Hilfe (Option /?) an, z.B.
C:\> fsutil /?
Zusätzlich finden sie im Internet zahlreiche Hinweise.
Programm fsutil.exe ist ein Standard Volume Werkzeug:
Liste aller verfügbaren Volumes (auch nicht verbundene):
C:\> fsutil fsinfo drives
Anzeige der Volume-Type:
C:\> fsutil fsinfo drivetype C:
Anzeige der Volume-Eigenschaften:
C:\> fsutil fsinfo volumeinfo C:
Anzeige der NTFS-Eigenschaften für Insider
C:\> fsutil fsinfo ntfsinfo C:
Anzeige der Volume-Statistik für Insider
C:\> fsutil fsinfo statistics C:
Freier und verfügbarer Speicherplatz:
C:\> fsutil volume diskfree C:
Trennt die Verbindung mit einem Volume
C:\> fsutil volume dismount C:
Anzeige der bekannten entfernten FileServer
C:\> net view
Anzeige der Energiespar-Optionen:
C:\> powercfg /query
Anzeige von Name und Serien-Nummer eines Volumes:
C:\> vol
Anzeige anderer Volumes nach Volume-Wechsel:
C:\> D:
D:\> vol
Disketten-Verwaltung mit diskcomp und diskcopy
Verwaltung virtueller Laufwerke mit subst.exe
Verwaltung der Volume-Bezeichnungen mit label.exe Programm mountvol.exe dient zur Verbindung mit einem Volume.
Programm sharepubw.exe dient zur Freigabe eines Verzeichnisses (PC als Mini-Fileserver) Im Explorer erstellt man die Freigabe eines Verzeichnisses durch Rechtsklick | Freigabe oder Rechtsklick | Eigenschaften | Freigabe
Einige Befehle / Programme betreffen Hardware oder Hardware-nahe Funktionen, z.B.
chkdsk, chkntfs, defrag, diskcomp, diskpart, diskperf, format, recover, ...
Details und Beispiele zur Anwendung der VBA Funktion Shell Alternative Lösungen mit Perl oder PHP sind fast immer einfacher und wesentlich schneller !

Volume-Verwaltung mit ActiveX

Das ActiveX Objekt FileSystemObject erlaubt den Zugriff auf das Dateisystem und damit auch auf Volumes. Die Verwaltung erfolgt mit Sub-Objekten, Methoden und Eigenschaften, z.B. des Sub-Objekts Drives
Das Sub-Objekt Drives repräsentiert alle bekannten Volumes. Die Objekte fso,drvs werden für die meisten folgenden Beispiele verwendet.
Dim fso, drv, drvs As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set drvs = fso.Drives

Anzahl der Volumes

Eigenschaft Count

nd = fso.Drives.Count

Existiert ein Volume ?

Eigenschaft DriveExists, Argument = Laufwerks-Buchstabe (hier C )
c = Chr(67)
If fso.DriveExists(c) Then
'...
End If

Schleife über alle Drives

Beispiel zur Ausgabe einer Drive-Liste.
In der Schleife wird in der Variablen drv jeweils ein anderes Volume-Objekt angesprochen.
t = ""
For Each drv In drvs
t = t & drv.driveletter & ","
Next
MsgBox t

Adressierung eines Drives

Mit Methode GetDrive kann ein bestimmtes Volume ausgewählt werden (hier die Standard-Festplatte C: )

Set drv = fso.GetDrive(fso.GetDriveName("C:"))

Drive-Eigenschaften

Von einem einzelnen Drive-Objekt kann eine ganze Reihe von Eigenschaften ermittelt werden (hier der VolumeName )

Set drv = fso.GetDrive(fso.GetDriveName("C:"))
dp = drv.FreeSpace
MsgBox "FreeSpace = " & dp
Einige Drive-Eigenschaften:
AvailableSpace, DriveLetter, DriveType, FileSystem, FreeSpace, IsReady, Path, RootFolder, SerialNumber, ShareName, TotalSize, VolumeName
(Größen-Angaben in Byte.)
Die meisten Eigenschaften sind selbst-erklärend. DriveType liefert eine Zahl folgender Bedeutung:
NrDriveType
0Unbekannt
1Austauschbar (Diskette)
2Festplatte
3Netzlaufwerk
4CD-Laufwerk
5(Virtuelles) RAM-Laufwerk
VBA + ActiveX Beispiel:
Das Demo-Programm vol_prop_loop (unten) gibt die Eigenschaften aller bekannten Volumes in je einem Meldungs-Fenster aus.
Dabei wird für jedes Volume das Programm vol_prop_sub (rechts) aufgerufen:

Sub vol_prop_loop()
Dim fso, drvs, drv As Object
Set fso = CreateObject("Scripting.FileSystemObject")
For Each drv In fso.Drives
vol_prop_sub (drv.DriveLetter)
Next
End Sub
Sub vol_prop_sub(dc As String)
Dim t As String
Dim fso, drv As Object
t = "Volume " & dc & vbCrLf
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
Set drv = fso.GetDrive(fso.GetDriveName(dc & ":"))
t = t & "AvailableSpace = " & drv.AvailableSpace & vbCrLf
t = t & "DriveLetter = " & drv.DriveLetter & vbCrLf
t = t & "DriveType = " & drv.DriveType & vbCrLf
t = t & "FileSystem = " & drv.FileSystem & vbCrLf
t = t & "FreeSpace = " & drv.FreeSpace & vbCrLf
t = t & "IsReady = " & drv.IsReady & vbCrLf
t = t & "Path = " & drv.Path & vbCrLf
t = t & "RootFolder = " & drv.RootFolder & vbCrLf
t = t & "SerialNumber = " & drv.SerialNumber & vbCrLf
t = t & "ShareName = " & drv.ShareName & vbCrLf
t = t & "TotalSize = " & drv.TotalSize & vbCrLf
t = t & "VolumeName = " & drv.VolumeName & vbCrLf
MsgBox t
End Sub
Tipp: ActiveX-Methoden können mit leicht unterschiedlicher Syntax auch mit Javascript für das Scripting von Webseiten verwendet werden - allerdings nur auf Windows-Systemen.
fso = new ActiveXObject("Scripting.FileSystemObject");

Volume-Verwaltung mit DLL

Zahlreiche Programm-Bibliotheken (Dynamic Link Library DLL) bieten Programme und Funktionen, die mit eigenen VBA Programmen genutzt werden können.

Die meisten DLLs sind allerdings vergleichsweise kompliziert anzuwenden, bescheiden dokumentiert und abhängig von der jeweiligen System- und DLL-Version.
Einen weiteren Nachteil teilen DLLs mit ActiveX: Beide sind nur auf Windows-Systemen verwendbar.

Im Gegensatz dazu sind Script-Programme in Perl oder PHP rasch und kostengünstig zu programmieren, mit vielen Beispielen gut dokumentiert und ganz oder zumindest weitgehend unabhängig vom Betriebssystem, d.h. zwischen Linux und Windows portabel.

Drive-Liste:

Dieses Demo-Programm wird als Beispiel für die Nutzung einer DLL angeführt. Es liefert eine Liste aller verfügbaren Drives in je einem Alarmfenster.

Allen DLL-Beispielen gemeinsam ist die obligatorische Deklaration am Beginn des Moduls. Hier erfolgt die Verknüpfung zwischen der verwendeten DLL und den im eigenen Programm verwendeten Funktionen.

Demo: Der Drive-Buchstabe wird mit Chr$(i+64) fixiert: Chr$(65) ergibt "A".

Die wichtigsten Eigenschaften werden mit GetDriveType ermittelt und ausgegeben.
Hinweis: Dieses Programm arbeitet mit Funktionen, ohne das Drive-Objekt (s.u.)

Sie können dieses Programm leicht für ihren Bedarf modifizieren:
Verwenden sie Function an Stelle von Sub und testen sie ein bestimmtes Laufwerk, oder suchen sie nach Festplatte, CD, ...
Das Ergebnis wird dann als Funktionswert zurückgegeben, die MsgBox kann entfallen.
Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Declare Function GetLogicalDrives Lib "kernel32" () As Long

Sub GetDrives()
Dim l&
Dim i, j As Integer
Dim s, t As String
Dim dt As Variant
dt = Array("unknown", _
"removable(Diskette, Cartridge)", _
"fixed (HardDisk)", "Network", _
"readonly(CD/DVD)", "RAMdisk")
l = GetLogicalDrives()
j = 0
For i = 1 To 31
If l And (2 ^ (i - 1)) Then
s = Chr$(i + 64) + ":\"
t = GetDriveType(s)
If (i = 1) Then j = 1 - t
t = t + j
s = "Drive = " & s & _
Chr(13) & "DriveType = " & t & _
Chr(13) & dt(t)
MsgBox (s)
End If
Next
End Sub
Microsoft: Windows API (Application Programming Interfcace), Referenz der verwendbaren DLLs. Eine Live-Demonstration finden sie auf der Seite Umgebungs-Daten mit ActiveX.

Volume wechseln

Bei Verwendung Relativer Pfade ist es gelegentlich notwendig, das Volume (Laufwerk) des aktuellen Pfades zu wechseln. Die VBA Funktion ChDrive bietet diese Möglichkeit.

Drive (Volume) wechseln:

Damit wechseln sie den aktuellen Pfad auf Volume "D"
ChDrive "D"