vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2017
 
zurück
Rubrik: Dialoge/Dateien   |   VB-Versionen: VB5, VB602.01.03
FSO: Arbeiten mit Dateien und Ordner, Teil 2

Teil 2 unseres FSO-Workshops beschäftigt sich mit den Objekten des FSO: Drive-Object, Folder-Objekt und File-Objekt. Weiterhin stellen wir Ihnen noch ein paar zusätzliche FSO-Methoden vor und erläutern auch kurz interessante Hilfsfunktionen für die Analyse von Dateinamen.

Autor:  Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  52.671 

Neue Version! sevEingabe 3.0 (für VB6 und VBA)
Das Eingabe-Control der Superlative! Noch besser und noch leistungsfähiger!
Jetzt zum Einführungspreis       - Aktionspreis nur für kurze Zeit gültig -

Teil 2 unseres FSO-Workshops beschäftigt sich mit den Objekten des FSO: Drive-Object, Folder-Objekt und File-Objekt. Weiterhin stellen wir Ihnen noch ein paar zusätzliche FSO-Methoden vor und erläutern auch kurz interessante Hilfsfunktionen für die Analyse von Dateinamen.

Das Drive-Objekt

Benötigen Sie eine Liste aller derzeit verfügbaren Laufwerke? Kein Problem. Hierfür stellt Ihnen das FileSystemObject mit dem Drive-Objekt ein Objekt zur Verfügung, mit dem sich das spielend leicht realisieren lässt.

Deklaration:

' im Allgemein-Teil der Form / des Moduls
Dim oFSO As New FileSystemObject
' Auflisten aller verfügbaren Laufwerke
Dim oDrive As Drive
 
For Each oDrive In oFSO.Drives
  List1.AddItem oDrive
Next

Das Drive-Objekt stellt noch viele interessante Eigenschaften und Methoden zur Verfügung.

Informationen eines bestimmten Laufwerks ermitteln
Nachfolgend zeigen wir, wie man die Eigenschaften des Drive-Objekts auslesen kann. Zunächst bestimmen wir, für welches der verfügbaren Laufwerke die Eigenschaften ausgelesen werden sollen:

' Laufwerk C:
Dim oDrive As Drive
Set oDrive = oFSO.GetDrive("C:")

Nun möchten wir zunächst wissen, ob das angegebene Laufwerk auch bereit ist, d.h. ob bei einem Diskettenlaufwerk eine Diskette eingelegt ist bzw. allgemein bei einem Wechselmedium, wie Zip-Laufwerk oder CD-Laufwerk ein Datenträger eingelegt ist. Anschließend ermitteln wir den Speicherplatz insgesamt, sowie den noch freien Speicherplatz:

' Laufwerk bereit?
If oDrive.IsReady Then    
  ' Kapazität, sowie noch verfügbaren Speicherplatz 
  ' ermitteln und in KB anzeigen
  Dim nSize As Currency
  Dim nFree As Currency
 
  nSize = oDrive.TotalSize
  nFree = oDrive.AvailableSpace
  MsgBox "Kapazität (kb): " & FormatNumber(nSize / 1024, "0") & _
    vbCrLf & "Noch frei (kb): " & FormatNumber(nFree / 1024, 0)
Else
  MsgBox "Laufwerk nicht bereit!"
End If

Um was für einen Laufwerkstyp handelt es sich eigentlich und welches Dateisystem wird verwendet? Diese Fragen beantworten uns die Eigenschaften DriveType und FileSystem:

' Laufwerkstyp ermitteln und anzeigen
Select Case oDrive.DriveType
  Case 0                              ' Unknown
    MsgBox "Unbekannter Laufwerkstyp"
  Case 1                              ' Removable
    MsgBox "Wechseldatenträger"
  Case 2                              ' Fixed
    MsgBox "Festplatte"
  Case 3                              ' Network
    MsgBox "Netzlaufwerk"
  Case 4                              ' CDROM
    MsgBox "CD-Laufwerk"
  Case 5                              ' RAM-Disk
    MsgBox "RAM-Disk"
End Select
 
' Welches Dateisystem wird verwendet? (z.B. NTFS oder FAT32)
MsgBox oDrive.FileSystem

Pfad und Stammverzeichnis eines Laufwerks ermitteln:

MsgBox "Pfad: " & oDrive.Root & vbCrLr & _
  "Root: " & oDrive.RootFolder

Die Path-Eigenschaft gibt immer das Stammlaufwerk ohne Backslash zurück, also C: - nicht C:\. RootFolder hingegen gibt das komplette Stammverzeichnis zurück - also C:\. Gleichzeitig repräsentiert RootFolder ein Folder-Objekt, das wie folgt zugewiesen werden kann:

A' Folder-Objekt erstellen (Stammverzeichnis eines Laufwerks)
Dim oFolder As Folder
Set oFolder = oDrive.RootFolder

Mehr zum Folder-Objekt im Anschluss an die Besprechung des Drive-Objekts.

Handelt es sich bei einem Laufwerk um ein Netzlaufwerk, so lässt sich der Freigabename wie folgt ermitteln:

' Freigabename eines Netzlaufwerks anzeigen
If oDrive.DriveType =3 Then
  MsgBox oDrive.ShareName
End If

Abschließend möchten wir noch die Datenträger-Bezeichnung (VolumeName), sowie dieSeriennummer des Laufwerks ermitteln. Und das geht so:

' Datenträgerbezeichnung
MsgBox oDrive.VolumeName
 
' Seriennummer des Datenträgers
MsgBox oDrive.SerialNumber

Diese beiden Eigenschaften funktionieren auch bei Netzlaufwerken!

Das Folder-Objekt

Über das Folder-Objekt lassen sich u. a. sehr schnell alle Ordner eines Verzeichnisses ermitteln. Das FSO unterstützt hierbei sowohl lokale Verzeichnisse als auch Netzwerkverzeichnisse. Nachfolgend ein Beispiel, wie sich alle Ordner eines "Ausgangsverzeichnisses" in einer ListBox anzeigen lassen:

Deklaration:

' im Allgemein-Teil der Form / des Moduls
Dim oFSO As New FileSystemObject
' Auflisten aller Ordner im Laufwerk C:
Dim oFolder As Folder
 
For Each oFolder In oFSO.GetFolder("C:").SubFolders
  List1.AddItem oFolder
Next

Das Folder-Objekt stellt noch viele interessante Eigenschaften und Methoden zur Verfügung. So kann z.B. über die Files-Aufzählung die Anzahl der Dateien eines Ordners ermittelt werden:

Dim oFolder As Folder
 
' Ausgangsverzeichnis
Set oFolder = oFSO.GetFolder("c:")
 
' Anzahl Dateien im Stammverzeichnis von C:
Dim nCount As Long
nCount = oFolder.Files.Count
MsgBox "Im Verzeichnis C:\ befinden sich " & CStr(nCount) & " Datei(en)."

Wahrscheinlich ahnen Sie es jetzt schon: Über die Files-Aufzählung des Folder-Objekts lassen sich auch schnell alle Dateien eines Ordner ermitteln. Genau!

Dim oFolder As Folder
Dim oFile As File
 
' Ausgangsverzeichnis
Set oFolder = oFSO.GetFolder("c:")
 
' alle Dateien im Stammverzeichnis C: anzeigen
For Each oFile In oFolder.Files
  List1.AddItem oFile
Next

Informationen eines bestimmten Ordners ermitteln
Nachfolgend zeigen wir, welche Ordner-Informationen über das Folder-Objektermittelt werden können.

Ordner-Attribute lesen und setzen
Über die Attributes-Eigenschaft lassen sich die Ordner-Attribute, wie schreibgeschützt, versteckt usw. sowohl lesen als auch neu festlegen:

' Folder-Objekt erstellen
Dim oFolder As Folder
Set oFolder = oFSO.GetFolder("d:\temp")
' Ordner-Attribute
Dim nAttr As Long
nAttr = oFolder.Attributes
 
' Schreibgeschützt?
If nAttr And ReadOnly Then 
  MsgBox "Schreibgeschützt!"
Else
  ' Schreibschutz erstellen!
  oFolder.Attributes = nAttr Or ReadOnly
End If

Erstellungsdatum, letzte Änderung und Datum des letzten Zugriffes ermitteln

' Erstellungsdatum
MsgBox "Erstellungsdatum: " & oFolder.DateCreated
 
' Letzter Zugriff
MsgBox oFolder.DateLastAccessed
 
' Letzte Änderung
MsgBox oFolder.DateLastModified

Kopieren, Löschen und Verschieben
Über die Methoden Copy, Delete und Move kann ein Ordner kopiert, gelöscht oder verschoben werden. Dieses Thema wurde jedoch bereits im 1. Teil dieses Workshops behandelt, so dass wir an dieser Stelle nicht näher darauf eingehenwerden.

Ordnertyp und Größe ermitteln
Über die Eigenschaft Type bekommen Sie den Typ des Ordners im Klartext zurückgeliefert, so wie Sie das vom Windows Explorer her kennen. Bei den meisten Ordnern handelt es sich um "Dateiordner". Für den Ordner "Tasks" im Windowsverzeichnis erhalten Sie beispielsweise als Typ Geplante Tasks.

Die Größe eines Ordners (inkl. aller Unterordner und Dateien) lässt sich über die Size-Eigenschaft ermitteln. Aber Achtung: Hin und wieder tritt beim Abfragen der Size-Eigenschaft der Laufzeitfehler "70 - Zugriff verweigert" auf. Deshalb empfiehlt es sich hier immer, eine Fehlerbehandlung einzubauen:

' Fehlerbehandlung aktivieren
On Error Resume Next
 
' Ordnergröße (inkl. Unterordner und Dateien)
Dim nBytes As Currency
nBytes = oFolder.Size
If Err.Number = 70 Then nBytes = -1  ' Zugriff verweigert!
 
' Fehlerbehandlung ausschalten
On Error Goto 0
 
MsgBox "Typ: " & oFolder.Type & vbCrLf & _
  "Größe: " & IIf(nBytes = -1, "unbekannt", _
  FormatNumber(nBytes / 1024, 0) & " KB")

Laufwerksbuchstabe, Name des Ordners, vollständiger Pfad usw.

' Laufwerksbuchstabe
MsgBox oFolder.Drive
 
' Ordnername (ohne Pfadangabe)
MsgBox oFolder.Name
 
' vollständiger Pfad (Standard-Eigenschaft)
MsgBox oFolder.Path
 
' Kurzer Dateiname (im DOS-Format 8.3)
MsgBox oFolder.ShortName
 
' Kurzer Pfadname (im DOS-Format 8.3)
MsgBox oFolder.ShortPath

Übergeordneten Ordner ermitteln
Sie möchten wissen, ob es sich bei dem Ordner um den Root-Ordner handelt oder ob es einen übergeordneten Ordner gibt? Kein Problem

If Not oFolder.IsRootFolder Then
  ' Übergeordneten Ordner ermitteln
  MsgBox "Übergeordneter Ordner: " & oFolder.ParentFolder
End If

Anmerkung: Bei ParentFolder handelt es sich um ein Folder-Objekt, das Sie wie folgt verwenden können:

Dim oParent As Folder
If Not oFolder.IsRootFolder Then
  Set oParent = oFolder.ParentFolder
End If

Gibt es weitere Unterordner?
Diese Frage beantwortet Ihnen SubFolders:

MsgBox "Anzahl Unterordner: " & CStr(oFolder.SubFolders.Count)

Wie man über "SubFolders" alle Unterordner ermitteln kann, haben wir Ihnen bereits am Anfang der Beschreibung des Folder-Objekts gezeigt.

Das File-Objekt

Wie bereits gezeigt, lassen sich über die Files-Aufzählung des Folder-Objekts alle Dateien eines Verzeichnisses ermitteln. Im Gegensatz zur Visual Basic DIR-Funktion besteht jedoch keine Möglichkeit einen Dateifilter festzulegen (wie z.B. *.txt), d.h. es werden immer alle Dateien ermittelt. Ist dies jedochnicht erwünscht, müssen Sie die Schleife von a-z durchlaufen und die Ausgabe entsprechend filtern:

' nur .TXT-Dateien in einer ListBox anzeigen
Dim oFolder As Folder
Dim oFile As File
 
' Ausgangsverzeichnis
Set oFolder = oFSO.GetFolder("d:\temp")
 
' alle Dateien durchlaufen
For Each oFile In oFolder.Files
  ' nur .txt Dateien!
  If LCase$(oFSO.GetExtensionName(oFile)) = "txt" Then
    List1.AddItem oFile.Name
  End If
Next

Die Anzahl der in einem Verzeichnis vorhandenen Dateien lässt sich über Files.Count ermitteln:

' Anzahl Dateien
MsgBox oFolder.Files.Count

Informationen einer bestimmten Datei ermitteln
Das File-Objekt verfügt im Großen und Ganzen über die selben Eigenschaften wie das Folder-Objekt, so dass wir diese nachfolgend nur noch einmal kurz in Erinnerung bringen:

  • Attributes (Dateiattribute abfragen oder neu setzen)
  • Copy (Datei kopieren)
  • DateCreated (Erstellungsdatum der Datei
  • DateLastAccessed (letzter Datei-Zugriff)
  • DateLastModified (Datum der letzten Änderung)
  • Delete (Datei löschen)
  • Drive (Laufwerksbuchstabe)
  • Move (Datei verschieben)
  • Name (Name der Datei ohne Pfadangabe)
  • ParentFolder (Pfad des Ordners, in dem sich die Datei befindet)
  • Path (vollständiger Pfad inkl. Dateiname)
  • ShortName (kurzer Dateiname im DOS-Format 8.3)
  • ShortPath (kurzer Pfadname im DOS-Format 8.3)
  • Size (Dateigröße in Bytes)
  • Type (Dateityp)

Type enthält eine von der Dateierweiterung abhängige Dateibeschreibung, z.B. "Microsoft Access-Datenbank" für MDB-Dateien. Bei der Dateibeschreibung handelt es sich um die selbe Beschreibung, die auch im Windows Explorer angezeigt wird.

Anmerkung: Über die Name-Eigenschaft kann der Dateiname nicht nur gelesen, sondern auch neu festgelegt werden:

' Datei umbenennen
Dim oFile As File
Set oFile = oFolder.Files("Dateiname")
oFile.Name = "Neuer_Dateiname"

Systemverzeichnisse und temporäre Dateinamen

Das FSO-Objekt stellt neben den Drive-, Folder- und File-Objekten noch zusätzliche weitere Eigenschaften zur Verfügung, die sehr häufig in der eigenen Anwendung benötigt werden.

Spezielle Systemverzeichnisse
Wie man das Anwendungsverzeichnis ermittelt, in dem die eigene EXE-Datei ausgeführt wird, sollte hinreichend bekannt sein: App.Path. Wie sieht es aber aus, wenn Sie das Verzeichnis für temporäre Dateien, das Windows-Verzeichnis oder das Windows-/System-Verzeichnis benötigen? Klar gibt es hierfür bereits fertige Lösungen - meist über entsprechende API-Funktionen oder auch über das Auslesen der Umgebungsvariablen. Wenn Sie aber schon das FileSystemObject verwenden, können Sie diese drei Systemordner auch über das FSO-Objekt ermitteln:

Dim oFSO As FileSystemObject
 
' Verzeichnis für temporäre Dateien
MsgBox oFSO.GetSpecialFolder(TemporaryFolder)
 
' Windowsverzeichnis
MsgBox oFSO.GetSpecialFolder(WindowsFolder)
 
' Systemverzeichnis
MsgBox oFSO.GetSpecialFolder(SystemFolder)

Temporäre Dateinamen
Neben dem Ermitteln des Verzeichnisses für temporäre Dateien bietet uns das FileSystemObject sogar die Möglichkeit, selbständig einen noch nicht vorhandenen temporären Dateinamen zu ermitteln, den wir dann für unsere weitere Arbeit verwenden können:

' Neuer temporärer Dateiname
Dim sFileTemp As String
sFileTemp = oFSO.GetTempFile()
 
' vollständiger Pfad
sFileTemp = oFSO.GetSpecialFolder(TemporaryFolder) & _
  "\" & sFileTemp

Hilfsfunktionen für Dateinamen / Verzeichnisse

Das FSO-Objekt stellt diverse Methoden zur Verfügung, die Ihnen bei der Analyse bzw. Synthesevon Datei- und Verzeichnisnamen behilflich sind. Hierbei erwarten die nachfolgenden Methoden immer String-Parameter und geben als Ergebnis ebenfalls wieder einen String zurück, d.h. Sie können die Methoden auch unabhängig von den Eigenschaften des File-/Folder-Objekts einsetzen.

BuildPath setzt einen Pfad und Dateinamen zusammen:

MsgBox oFSO.BuildPath("c:\", "test.txt")  ' c:\test.txt

GetAbsolutePathName liefert den vollständigen Dateinamen einer Datei, wenn nur ein Name relativ zum aktuellen Verzeichnis angegeben wurde:

' Annahme: aktuelles Verzeichnis = c:\temp, 
' dann gibt nachfolgender Aufruf 
' "c:\temp\doc\myDoc.doc" zurück
MsgBox oFSO.GetAbsolutePathName("doc\myDoc.doc")

GetBaseName liefert den reinen Dateinamen - ohne Pfadangabe und ohne Dateierweiterung:

' Liefert "test"
MsgBox oFSO.GetBaseName("c:\temp\test.tmp")

GetDriveName gibt das Laufwerk zurück. Als Parameter kann entweder ein Verzeichnis oder ein vollständiger Dateiname inkl. Pfadangabe angegeben werden.

' Liefert "c:"
MsgBox oFSO.GetDriveName("c:\temp\test.txt")

GetExtensionName gibt die Dateierweiterung eines Dateinamens zurück:

' Liefert "txt"
MsgBox oFSO.GetExtensionName("c:\temp\test.txt")

GetFileName extrahiert den Dateinamen inkl. Extension aus Pfad+Dateiname:

' Liefert "test.txt"
MsgBox oFSO.GetFileName("c:\temp\test.txt")

GetParentFolderName extrahiert den Pfad aus Pfad+Dateiname bzw. gibt das übergeordnete Verzeichnis einer Pfadangabe zurück:

' Liefert "c:\temp"
MsgBox oFSO.GetParentFolderName("c:\temp\test.txt")
 
' Liefert c:\
MsgBox oFSO.GetParentFolderName("c:\temp")

Ausblick auf Teil 3

Nun, da wir alle Objekte des FileSystemObject besprochen haben und auch auf alle Eigenschaften und Methoden eingegangen sind, wäre es sicherlich ganz hilfreich, unser "neues Wissen" in einem kleineren (oder auch größeren) Projekt zu demonstrieren

Und genau das haben wir auch vor! Im abschließenden dritten Teil unseres FSO-Workshops "basteln" wir einen kleinen Datei-Commander, ähnlich dem bekannten Norton Commander von der Firma Symantec.

Unseren Datei-Commander wollen wir hierbei mit folgenden Features ausstatten:

  • Zwei Fenster für die Anzeige der Ordner/Dateinamen
  • Laufwerk- und Verzeichniswechsel
  • Filter-Funktion für Dateinamen
  • Anzeige von Datum/Uhrzeit, Dateigröße und Attribute
  • Ändern von Dateiattributen
  • Kopieren, Löschen und Verschieben von Dateien
  • integrierter Editor zum Bearbeiten von Textdateien
  • Erstellen von neuen Textdateien

Sie sehen schon: Wir werden wirklich alle Funktionen des FSO-Objekt ausschöpfen.

Dieser Workshop wurde bereits 52.671 mal aufgerufen.

Über diesen Workshop im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Workshop, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2017 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel