Visual Basic stellt keine speziellen Funktionen bereit, mit denen die Bezeichnung von Laufwerken ermittelt und gesetzt werden kann. Zum Bestimmen der Bezeichnung eines Laufwerks kann man jedoch einen Trick mit der Funktion Dir anwenden. Dir("C:\", vbVolume) würde beispielsweise die Bezeichnung des Laufwerks C: zurückgeben. Alternativ kann man auf die vom Betriebssystem bereitgestellte Funktion GetVolumeInformation zurückgreifen:
Um die Bezeichnung eines Laufwerks zu setzen, kann die API-Funktion SetVolumeLabel benutzt werden. Die Kapselung in der Funktion SetDriveName erwartet im ersten Parameter den Pfad des Wurzelverzeichnisses des Laufwerks, dessen Bezeichnung geändert werden soll. Ein Beispielaufruf könnte Debug.Assert SetDriveName("C:\", "Windows XP") lauten:
Abschließen von Pfadangaben mit einem Backslash
Manchmal bekommt man unter Visual Basic von einer API-Funktion oder einer beliebigen anderen Funktion einen Pfad zurückgeliefert, an den ein Dateiname angehängt werden muß. Dazu ist eine Funktion notwendig, die das letzte Zeichen der Pfadangabe prüft und gegebenenfalls einen Backslash hinzufügt:
Verschieben von Dateien
In Visual Basic werden Dateien mit der Anweisung FileCopy kopiert, für das Verschieben von Dateien stellt Visual Basic aber keine Funktion FileMove zur Verfügung. Um eine Datei zu verschieben, kann die Name-Funktion, die eigentlich zum Umbenennen von Dateien dient, verwendet werden. Wenn der Quell- und Zielpfad voneinander abweichen, dann wird die Datei auch verschoben. Viele Programmierer verschieben eine Datei durch Kopieren an den neuen Speicherort und anschließendes Löschen der alten Datei. Das funktioniert aber nicht, wenn beispielsweise eine 10 MB große Datei auf einem Laufwerk verschoben werden soll, wenn nur mehr 9 MB frei sind. Hier muß die Datei echt verschoben werden:
Ist eine Datei schreibgeschützt?
Bei der Frage, ob eine Datei schreibgeschützt ist, entscheidet nicht nur ihr Attribut (schreibgeschützt), sondern auch die Art des Datenträgers (z. B. CD-ROM-Laufwerk) oder die erteilten Rechte des Benutzers (etwa auf einem entsprechend konfigurierten NT-Benutzerkonto oder auf einem Netzwerklaufwerk).
Eine beliebte Möglichkeit der Überprüfung, ob tatsächlich in eine Datei geschrieben werden kann, ist daher die „Trial-and-Error“-Methode, die Datei durch einen Open-Befehl für das Schreiben zu öffnen. Gelingt dies nicht, ist die Datei offensichtlich schreibgeschützt. Der Nachteil dieser Methode ist, daß sich, wenn die Datei problemlos für das Schreiben geöffnet werden kann, ihr Zeitstempel ändert – ein Nebeneffekt, der für das Ermitteln dieser einfachen Information eigentlich nicht zu vertreten ist:
Man kann dieses Problem umgehen, indem man über das Windows-API die Dateizeiten der Datei ausliest und nach dem Versuch, in die Datei zu schreiben, wieder zuweist.
Zugriff auf Dateien im Netzwerk ohne Laufwerkszuweisung
Um im Netzwerk eine Dateizugriffe durchzuführen, müssen Sie nicht unbedingt ein Netzlaufwerk verbinden, es muß nur der Bereich, in dem der Dateizugriff erfolgen soll, freigegeben sein. Die gewünschte Datei kann dann folgendermaßen angesprochen werden:
Dieser Code schreibt den Text Ein Text in die Datei test.txt; auf den Server mit dem Namen Servername in das Verzeichnis, das als dir freigegeben wurde. Anstelle von Servername könnte natürlich ein beliebiger Computername stehen (z. B. \\MyComputer).
Ermitteln des Dateititels einer Datei
Neben den Standarddialogfeldern für Öffnen, Speichern etc. ist in der ComDlg32.dll auch eine Funktion enthalten, die den Dateinamen einer Datei, wie er von der Shell angezeigt wird, ermittelt. Die beiden Parameter lpszTitle und cbBuf wurden von String in Long geändert:
Prüfen zweier Dateien auf Gleichheit
Ab und zu ist es notwendig, zwei kleinere Dateien auf Gleichheit zu überprüfen. Dazu bietet sich die Funktion CompareSmallFiles an. Bei größeren Dateien sollten immer nur Teile einer bestimmten Größe gelesen und verglichen werden. Die Funktion prüft am Anfang, ob die Dateien gleich lang sind; ist dies nicht der Fall, können die Dateien nicht den gleichen Inhalt besitzen:
Trennen der Verbindung mit einem Netzlaufwerk
Um die Verbindung zu einem Netzlaufwerk zu trennen, kann der nachfolgende Code verwendet werden. Zu beachten ist dabei, daß der Laufwerksbuchstabe mindestens zwei Zeichen lang sein muß, also mit Doppelpunkt, ein Backslash, z. B. "E:\", ist auch erlaubt:
Verbinden eines Netzlaufwerks mittels eines Dialogs
Folgender Code öffnet den Assistenten zum Verbinden zu einem Netzlaufwerk. Es wird keine Fehlerbehandlung durchgeführt:
Bestimmen des nächsten freien Laufwerks
Um dem nächsten Laufwerksbuchstaben zu ermitteln, der noch nicht belegt ist, bietet sich der im Folgenden angegebene Code an. Die Funktion NextFreeDrive gibt eine zwei Zeichen lange Zeichenfolge bestehend aus Laufwerksbuchstabe und Doppelpunkt zurück:
Ermitteln des Kurznamens eines Pfades
Um den Kurznamen zu einem Pfad zu ermitteln, kann folgender Code verwendet werden:
Erstellen von Internetverknüpfungen
Der nachstehende Code erstellt eine Internetverknüpfung, d. h., eine Datei mit der Dateinamenerweiterung .url. Dazu werden die Visual-Basic-eigenen Funktionen für den Dateizugriff verwendet:
Setzen der Dateigröße ohne Neuschreiben der Datei
Ab und zu kommt es vor, daß man eine Datei kleiner machen will, als sie ist. Der naive Ansatz dazu ist, den Inhalt der Datei einzulesen, ihn zu verkleinern, dann die Originaldatei zu löschen und anschließend die Daten in eine neue Datei zu schreiben. Besonders bei großen Dateien erweist sich der Ansatz als nicht praktikabel: Wenn es sich um Dateien mehrerer Hundert Megabyte Größe handelt, dann kann man nämlich nicht einfach die Datei in den Arbeitsspeicher laden, sondern ist gezwungen, die Datei zu „zerteilen“ und dann blockweise zu kopieren. Erst dann kann die alte Datei gelöscht und durch die neue (z. B. durch Umbenennung) ersetzt werden:
Es wäre verwunderlich, wenn Windows zu diesem Zweck keine eigene API-Funktion bereitstellen würde. In diesem Fall haben wir Glück, die Funktion SetEndOfFile setzt das EOF, also das Dateiende, an die aktuelle Position, die man über SetFilePointer einstellen kann. Im Folgenden Beispiel wird eine Datei im Anwendungsverzeichnis geöffnet und ihre Dateilänge auf 12 Byte festgelegt:
Effizientes Ablegen eines Arrays in einer Datei
Wenn man Daten in einem Array ablegt, will man diese eventuell beim Beenden des Programms nicht „wegwerfen“, sondern in eine Datei speichern. Intuitiv würde man über Schleifen eine Zeichenfolge zusammenstellen, die den Inhalt der Elemente des Arrays enthält, und diesen anschließend in die Datei speichern. Der Aufwand dafür ist hoch und die Performanz des Programms leidet darunter stark. Stattdessen kann man sich auch der beiden Befehle Put und Get bedienen. Mit Put kann ein Array „auf einen Schlag“ persistent gemacht werden, Get liest es wiederum aus der Datei und weist es einer Arrayvariablen zu:
Anzeigen des Dialogs zum Suchen nach Dateien mittels DDE
Folgender Code zeigt den betriebssystemeigenen Dialog zum Suchen nach Dateien bzw. Ordnern an. Dazu muß ein DDE-fähiges Steuerelement auf dem Formular plaziert werden; die Anzeige erfolgt dann beispielsweise über folgenden Code:
Protokollieren von Programmaufrufen
Manchmal will man ein Protokoll aller Anwendungsstarts erstellen, um so beispielsweise zu ermitteln, welche Anwendungen beim Start von Windows ausgeführt werden bzw. um zu ermitteln, welche Anwendungen von einem Benutzer gestartet werden. Dies ist mit reinen Visual-Basic-Mitteln natürlich nicht möglich, allerdings kann man das Verhalten durch Ändern einiger Schlüssel in der Systemregistrierung erzielen. Dadurch ist es auch möglich, den Start von EXE-, LNK-, PIF, BAT- und COM-Dateien gegebenenfalls zu unterbinden. Für das Starten der Anwendung ist nämlich das in Visual Basic 6.0 entwickelte Programm zuständig, das in die Befehlszeile jene des zu startenden Programms hereingereicht bekommt.
In der Systemregistrierung müssen die folgenden Anpassungen vorgenommen werden (wir nehmen dabei an, daß die Anwendung in C:\ExeWrap.exe abgelegt ist):
Die Anwendung selbst besteht aus wenigen Zeilen Code:
Kopieren einer Diskette über den Windows-eigenen Dialog
Die im nächsten Listing angegebene Prozedur CopyDisk ruft den Windows-eigenen Dialog zum Kopieren von Disketten auf, wobei das angegebene Laufwerk im Dialog voreingestellt wird. Handelt es sich beim übergebenen Laufwerk nicht um ein Diskettenlaufwerk, wird ein Fehler ausgelöst:
Ermitteln der Seriennummer eines Datenträgers
Die Funktionsprozedur GetSerialNumber gibt die Seriennummer eines Datenträgers als 32-Bit-Ganzzahl zurück:
Ermitteln der verfügbaren Laufwerke und ihres Typs
Folgender Code gibt die Laufwerksbuchstaben der vorhandenen Laufwerke sowie deren Typ auf das Direktfenster aus. Dazu wird zuerst mit der API-Funktion GetLogicalDriveStrings eine Zeichenfolge ermittelt, die alle Laufwerksbuchstaben getrennt durch Nullzeichen beinhaltet. Anschließend wird diese Zeichenfolge aufgespaltet und mit der API-Funktion GetDriveType der Typ des jeweiligen Laufwerks bestimmt: