7.3 Dateien und Verzeichnisse
Die Klassenbibliothek des .NET Frameworks unterstützt den Entwickler mit den in Tabelle 7.1 aufgelisteten Klassen, die Laufwerke, Verzeichnisse und Dateien beschreiben.
Klasse | Beschreibung |
File |
Klassengebundene Methoden zum Zugriff auf eine Datei als Ganzes |
FileInfo |
Instanzmethoden zum Zugriff auf eine Datei als Ganzes |
Directory |
Klassengebundene Methoden zum Zugriff auf ein Verzeichnis |
DirectoryInfo |
Instanzmethoden zum Zugriff auf ein Verzeichnis |
Path |
Klassengebundene Methoden für Pfadangaben |
DriveInfo |
Instanzmethoden für Laufwerksinformationen |
SpecialDirectories |
Pfade Windows-eigener Verzeichnisse |
7.3.1 Dateizugriff mit File
Die nicht ableitbare Klasse File stellt nur statische Methoden zur Verfügung. Die Methoden von FileInfo sind Instanzmethoden und werden über eine Objektreferenz aufgerufen. Funktionell sind sich beide Klassen recht ähnlich.
Mit den Klassenmethoden von File lässt sich eine Datei erstellen, kopieren, löschen usw. Sie können auch die Attribute einer Datei lesen oder setzen, und – was auch sehr wichtig ist – Sie können eine Datei öffnen. In Tabelle 7.2, »Methoden in File«, sind die wichtigsten Methoden samt Rückgabetyp aufgeführt.
Methode | Rückgabetyp | Beschreibung |
AppendAllText |
- |
Fügt eine Zeichenfolge an und schließt die Datei. |
AppendText |
StreamWriter |
Hängt Text an eine existierende Datei an. |
Copy |
- |
Kopiert eine bestehende Datei. |
Create |
FileStream |
Erzeugt eine Datei in einem angegebenen Pfad. |
CreateText |
StreamWriter |
Erstellt oder öffnet eine Textdatei. |
Delete |
- |
Löscht eine Datei. |
Exists |
Boolean |
Gibt an, ob die angegebene Datei existiert. |
GetAttributes |
FileAttributes |
Bitfeld der Dateiattribute |
GetCreationTime |
DateTime |
Erstellungsdatum und die Uhrzeit einer Datei |
GetLastAccessTime |
DateTime |
Datum und Uhrzeit des letzten Zugriffs |
GetLastWriteTime |
DateTime |
Datum und Uhrzeit des letzten Schreibzugriffs |
Move |
- |
Verschiebt eine Datei in einen anderen Ordner oder benennt sie um. |
Open |
FileStream |
Öffnet eine Datei. |
OpenRead |
FileStream |
Öffnet eine Datei zum Lesen. |
OpenText |
StreamReader |
Öffnet eine Textdatei zum Lesen. |
OpenWrite |
FileStream |
Öffnet eine Datei zum Schreiben. |
ReadAllBytes |
Byte() |
Liest binär in ein Byte-Array und schließt die Datei. |
ReadAllLines |
String() |
Liest jede Zeile in ein String und schließt die Datei. |
ReadAllText |
String |
Liest eine Textdatei und schließt sie. |
SetAttributes |
– |
Setzt Dateiattribute. |
SetCreationTime |
– |
Setzt Erstellungsdatum und -uhrzeit. |
SetLastAccessTime |
– |
Setzt Datum und Uhrzeit des letzten Zugriffs. |
SetLastWriteTime |
– |
Setzt Datum und Uhrzeit des letzten Schreibzugriffs. |
WriteAllBytes |
– |
Schreibt ein gegebenes Byte-Array in eine neue Datei. |
WriteAllLines |
– |
Schreibt ein gegebenes String-Array in neue Datei. |
WriteAllText |
– |
Schreibt einen gegebenen Text in eine neue Datei. |
Alle Methoden, die eine Datei nach der Operation offen lassen, geben ein Stream-Objekt zurück. Mit ihm haben Sie Zugriff auf den Inhalt der Datei. Ein FileStream beschreibt dabei einfache Bytesequenzen, ein StreamReader basiert auf einer Textdatei.
Einige typische Dateioperationen wollen wir uns nun näher ansehen.
Kopieren einer Datei
Zum Kopieren einer Datei dient die Methode Copy, die einfach überladen ist:
Public Shared Sub Copy(sourceFileName As String, destFileName As String) Public Shared Sub Copy(sourceFileName As String, destFileName As String, _ overwrite As Boolean) |
Das erste Argument ist der Dateiname der zu kopierenden Datei. Befindet sie sich in keinem bekannten Suchpfad, muss der gesamte Zugriffspfad beschrieben werden. Im zweiten Argument geben Sie das Zielverzeichnis und den Namen der Dateikopie an. Die Betriebssysteme der Quelle und des Ziels bestimmen jeweils, welche Namen erlaubt sind. Befindet sich im Zielverzeichnis bereits eine gleichnamige Datei, bestimmt der dritte Parameter das Verhalten. Fehlt er oder ist er False, wird die Ausnahme DirectoryNotFoundException ausgelöst. Beim Wert True wird kommentarlos überschrieben. Ein Beispiel:
File.Copy("C:\Test1.txt", "D:\Test2.txt")
Wenn Sie die Pfadangabe in einem String-Literal festlegen, müssen Sie beachten, dass jedes Anführungszeichen im Pfad gedoppelt werden muss, damit die Zeichenkette nicht vorzeitig beendet wird.
Im folgenden Beispiel wird der Anwender dazu aufgefordert, den Pfad und das Zielverzeichnis der zu kopierenden Datei einzugeben. Dabei kann es zu verschiedenen Ausnahmen kommen, beispielsweise wenn die zu kopierende Datei nicht gefunden wird oder der Anwender das Quell- oder Zielverzeichnis an der Konsole nicht angibt. Diese Fehler werden im Code aufgefangen und behandelt. Unspezifische oder vergessene Fehler von IO-Operationen fängt der letzte Catch-Zweig ab.
'...\IO\Dateien\Kopieren.vb |
Option Strict On
Imports System.IO
Namespace EA
Module Kopieren
Sub Test()
Dim source, destination As String
Console.Write("Datei zum Kopieren: ") : source = Console.ReadLine()
Console.Write("Kopierziel: ") : destination = Console.ReadLine()
Try
File.Copy(source, destination)
Console.WriteLine("Erfolgreich kopiert.")
Catch e As DirectoryNotFoundException
Console.WriteLine(e.Message) ' Zielverzeichnis nicht gefunden
Catch e As FileNotFoundException
Console.WriteLine(e.Message) ' zu kopierende Datei nicht gefunden
Catch e As ArgumentException
Console.WriteLine(e.Message) ' Ziel- oder Quellverzeichnis fehlt
Catch e As IOException
Console.WriteLine(e.Message) ' unbehandelte Ausnahme
End Try
Console.ReadLine()
End Sub
End Module
End Namespace
Als Pfad ist neben der absoluten Angabe, die auch Suchpfade einschließt, eine relative Angabe zulässig. Relative Pfadangaben beziehen sich dabei auf das aktuelle Arbeitsverzeichnis. Beim Programmstart ist das das Verzeichnis, in dem sich die ausführbare Datei der Anwendung befindet. Normalerweise werden Sie als Entwickler nicht wissen, in welchem Pfad der Anwender das Programm installiert hat. Sie können ihn mit
Directory.GetCurrentDirectory()
ermitteln. Anschließend wird noch der Dateiname angehängt. Da GetCurrentDirectory nicht mit einem Backslash (\) abschließt, verbinden wir die Zeichenketten nicht direkt mit &.
Dim source As String = _ Path.Combine(Directory.GetCurrentDirectory(), "MyDoc.txt") Dim destination As String = "C:\DuplicatedDoc.txt" File.Copy(source, destination)
Löschen einer Datei
Die Syntax der Methode Delete zum Löschen einer Datei lautet:
Public Shared Sub Delete(path As String) |
Der Parameter path erwartet entweder eine absolute oder relative Pfadangabe. Ungültige Angaben können auch hier unterschiedliche Ausnahmen auslösen.
File.Delete("C:\MyDoc.txt")
Verschieben einer Datei
Die Syntax der Methode Move zum Verschieben einer Datei ähnelt der der Methode Copy:
Public Shared Sub Move(sourceFileName As String, destFileName As String) |
Dem ersten Parameter wird die zu verschiebende Datei übergeben, dem zweiten der neue Pfad der Datei. Mit Move lassen sich Dateien nicht nur aus einem Quell- in ein Zielverzeichnis verschieben, sondern auch umbenennen.
File.Move("C:\MyDoc.txt", "C:\Test.Doc")
Prüfen, ob eine Datei existiert
Bevor Sie eine Datei öffnen, sollten Sie prüfen, ob sie überhaupt existiert. Die Klasse File hat dazu die Methode Exists, die False zurückliefert, wenn die Datei nicht gefunden wird.
Dim strFile As String = "C:\MyFile.txt" If File.Exists(strFile) Then ...
Eine ähnliche Codesequenz ist in jedem Programm sinnvoll, in dem eine Operation die Existenz einer Datei voraussetzt. Das erspart die Codierung einer Ausnahmebehandlung.
Öffnen einer Datei
Bevor Sie den Inhalt einer Datei lesen bzw. ändern können, muss diese geöffnet werden. Eine Datei zu öffnen sagt aber noch nichts darüber aus, was ein Benutzer mit dieser Datei anfangen darf – ob er sie nur lesen kann oder auch ändern darf. Auch die Berechtigung gleichzeitiger Zugriffe ist nicht selbstverständlich.
Vier Methoden der Klasse File öffnen eine Datei: OpenRead, OpenText, OpenWrite sowie die überladene Methode Open. In ihr sind die beiden letzten Parameter optional.
Public Shared Function Open(path As String, mode As FileMode, _
access As FileAccess, share As FileShare) As FileStream |
Dem Parameter path wird beim Aufruf die Pfadangabe als Zeichenfolge übergeben. Sie besteht aus dem Pfad und dem Dateinamen.
Das Öffnen einer Datei erledigt das Betriebssystem, das wissen muss, wie es die Datei öffnen soll. Der mode-Parameter vom Typ der Enumeration FileMode steuert dieses Verhalten (siehe Tabelle 7.3).
Konstante | Beschreibung |
Append |
Öffnet eine bestehende Datei und setzt den Dateizeiger an das Dateiende. Existiert die Datei noch nicht, wird sie erzeugt. |
Create |
Erzeugt eine neue Datei bzw. überschreibt eine existierende. |
CreateNew |
Erzeugt immer eine neue Datei. Existiert sie, tritt eine IOException auf. |
Open |
Öffnet eine bestehende Datei. Existiert sie nicht, tritt eine FileNotFound-Exception auf. |
OpenOrCreate |
Öffnet eine bestehende Datei. Existiert sie nicht, wird eine neue erzeugt. |
Truncate |
Öffnet eine Datei und löscht deren Inhalt. |
Mit dem Parameter access wird festgelegt, ob die Datei gelesen oder/und geschrieben werden darf. Der Parameter ist vom Typ der Enumeration FileAccess (siehe Tabelle 7.4).
Konstante | Beschreibung |
Read |
Die Datei wird für den Lesezugriff geöffnet. |
Write |
Die Datei wird für den Schreibzugriff geöffnet. |
ReadWrite |
Die Datei wird für den Lese- und Schreibzugriff geöffnet. |
Eine Datei, die mit FileAccess.Read geöffnet wird, ist schreibgeschützt. Eine lesegeschützte Datei, deren Inhalt verändert werden soll, wird mit FileAccess.Write geöffnet. Die Konstante FileAccess.ReadWrite erlaubt sowohl einen lesenden als auch einen schreibenden Zugriff.
Versuchen Sie, auf eine mit FileAccess.Write geöffnete Datei lesend zuzugreifen, wird die Ausnahme NotSupportedException ausgelöst. Die Namensgebung ist unglücklich. Die Ausnahme bemängelt eine Operation, die aufgrund des Öffnungsmodus nicht unterstützt wird (besser wäre der Name NotSupportedFileAccessException).
Kommen wir nun zum letzten Parameter der Open-Methode – share. Er regelt den Fall, dass mehrere Anwendungen oder Threads gleichzeitig auf dieselbe Datei zugreifen (netzwerklose, nicht multitasking-fähige Rechner scheinen mir anachronistisch zu sein). Der Parameter ist vom Typ der Enumeration FileShare (siehe Tabelle 7.5).
Konstante | Beschreibung |
None |
Weitere Versuche, diese Datei zu öffnen, werden konsequent abgelehnt. |
Read |
Die Datei darf von anderen Threads nur zum Lesen geöffnet werden. |
Write |
Die Datei darf von anderen Threads nur zum Editieren geöffnet werden. |
ReadWrite |
Die Datei darf von anderen Anwendungen oder Threads sowohl zum Lesen als auch zum Editieren geöffnet werden. |
Durch die Parameter von Open können Sie eine Datei im gewünschten Modus öffnen. Ob Sie auf den Dateiinhalt zugreifen dürfen, ist damit nicht gesagt. Das Öffnen ist dafür eine notwendige, aber nicht hinreichende Voraussetzung (die Haustür ist offen, die Wohnungstür aber nicht unbedingt auch). Hier sehen Sie ein Beispiel dafür, wie eine Datei geöffnet wird:
Dim fs As FileStream = File.Open("C:\MyTestfile.txt", _ FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
Die Parameter besagen, dass die Datei MyTestfile.txt im Stammverzeichnis C:\ geöffnet werden soll – falls es dort eine solche gibt. Wenn nicht, wird sie neu erzeugt. Der Inhalt der Datei lässt sich nach dem Öffnen sowohl lesen als auch ändern. Gleichzeitig werden weitere Zugriffe auf die Datei strikt unterbunden.
Weitere Öffnungsmethoden
File.Open ist die allgemeinste Variante, eine Datei zu öffnen. Die Klasse File bietet drei spezialisierte Formen an:
Public Shared Function OpenRead (path As String) As FileStream Public Shared Function OpenWrite(path As String) As FileStream Public Shared Function OpenText (path As String) As StreamReader |
Mit OpenRead wird die angegebene Datei zum Lesen geöffnet, mit OpenWrite zum Schreiben. Diese beiden Methoden können, wie auch Open, Dateien beliebigen Inhalts öffnen. OpenText hingegen ist auf Textdateien spezialisiert. Das macht sich in einem unterschiedlichen Rückgabetyp bemerkbar. StreamReader liest einzelne Zeichen vom Typ Char, während FileStream uninterpretierte Bytes liest. Welche Bedeutung diese haben, wird durch die Interpretation des datenverarbeitenden Programms bestimmt. Damit bestimmt die Art der Daten, ob ein FileStream oder StreamReader angemessen ist. Erst nach dieser Entscheidung wird die passende Methode zum Lesen ausgesucht. Auf Details gehen wir später ein.
Öffnen einer Textdatei
Im folgenden Beispiel wird eine Textdatei geöffnet und der Inhalt an der Konsole ausgeben. Dazu wird im Code OpenText aufgerufen und die zurückgelieferte Referenz einer Objektvariablen des Typs StreamReader zugewiesen. Die Operationen, die im Zusammenhang mit dieser Klasse stehen, sollen uns an dieser Stelle noch nicht weiter interessieren.
'...\IO\Dateien\Textdatei.vb |
Option Strict On Imports System.IO Namespace EA Module Textdatei Sub Test() Console.Write("Zu öffnende Datei: ") Dim strFile As String = Console.ReadLine() If Not File.Exists(strFile) Then Console.WriteLine("Die Datei {0} existiert nicht!", strFile) Else ' Datei öffnen Dim sr As StreamReader = File.OpenText(strFile) Dim zeile As String zeile = sr.ReadLine() ' zeilenweise Ausgabe an der Konsole While zeile IsNot Nothing Console.WriteLine(zeile) zeile = sr.ReadLine() End While sr.Close() Console.WriteLine("---- Programm- und Dateiende ----") End If Console.ReadLine() End Sub End Module End Namespace
Nach dem Start des Programms gibt der Anwender den Pfad zu einer Textdatei an. Dann wird mit File.Exists geprüft, ob die Datei im spezifizierten Pfad überhaupt vorhanden ist. Gibt es die Datei nicht, erscheint eine entsprechende Meldung an der Konsole. Existiert die Datei, wird sie mit File.OpenText geöffnet. In einer Schleife wird die Datei zeilenweise mit der Methode ReadLine des StreamReader-Objekts bis zum Dateiende eingelesen. Danach wird die Schleife beendet und die Datei geschlossen.
Einfach schreiben und lesen
Einfacher zu programmieren, aber weniger flexibel, sind die Methoden ReadAllBytes, ReadAllLines und ReadAlltext zum Lesen und die Methoden WriteAllBytes, WriteAllLines und WriteAllText zum Schreiben. Alle gehören zur Klasse File. Mit der simplen Anweisung
File.WriteAllText("C:\MyTextFile.txt", strText)
können Sie bereits den Inhalt der Variablen strText in die angegebene Datei schreiben. Existiert die Datei schon, wird sie einfach überschrieben. Genauso einfach ist das Lesen:
Console.WriteLine(File.ReadAllText("C:\MyTextFile.txt"))
7.3.2 Dateizugriff mit FileInfo
Das Pendant zur der im vorigen Abschnitt beschriebenen Klasse File ist die ebenfalls nicht ableitbare Klasse FileInfo, die statt klassengebundener Methoden Instanzmethoden hat. Die Instanziierung erfolgt mit einem konkreten Dateipfad, zum Beispiel:
Dim myFile As New FileInfo("C:\TestDir\Testfile.txt")
Der Konstruktor prüft nicht, ob die Datei tatsächlich existiert. Bevor Sie Operationen ausführen, sollten Sie daher in jedem Fall vorher mit Exists prüfen, ob die Datei existiert.
If myFile.Exists Then ...
Während Exists in der Klasse File als Methode implementiert ist, der die Pfadangabe beim Aufruf übergeben werden muss, handelt es sich in der Klasse FileInfo um eine schreibgeschützte Eigenschaft des FileInfo-Objekts.
Eigenschaften
Die in Tabelle 7.6 aufgelistete Klasse FileInfo ist von FileSystemInfo abgeleitet. Sie ist auch Basisklasse der Klasse DirectoryInfo, die wir weiter unten ansprechen. Die Instanzeigenschaften beschreiben den Zustand der Datei, wie z. B. deren Länge oder Verzeichnis.
Eigenschaft | Beschreibung | |
Attributes |
Dateiattribute (Hidden, Archive, ReadOnly usw.) |
|
CreationTime |
Erstellungsdatum der Datei |
|
Directory |
Instanz des Verzeichnisses |
R |
DirectoryName |
Vollständige Pfadangabe, jedoch ohne den Dateinamen |
R |
Exists |
Gibt an, ob die Datei existiert. |
R |
Extension |
Dateierweiterung einschließlich des vorangestellten Punktes |
R |
FullName |
Vollständige Pfadangabe einschließlich des Dateinamens |
R |
IsReadOnly |
Gibt an, ob die Datei schreibgeschützt ist. |
|
LastAccessTime |
Zeit des letzten Zugriffs auf die Datei |
|
LastWriteTime |
Zeit des letzten schreibenden Zugriffs auf die Datei |
|
Length |
Gibt die Länge der Datei zurück. |
R |
Name |
Vollständiger Name der Datei |
R |
Attributes vom Typ FileAttributes ist ein Bitfeld fester Größe. Jedes Attribut einer Datei wird durch Setzen eines einzelnen Bits beschrieben. Um festzustellen, ob ein Dateiattribut gesetzt ist, muss das alle Attribute beschreibende Bitfeld mit dem gesuchten Dateiattribut bitweise And-verknüpft werden. Weicht das Ergebnis von null ab, ist das Bit gesetzt.
Angenommen, das Attribut XYZ sei durch die Bitkombination 0000 1000 (= 8) beschrieben und das Bitfeld habe den Wert 0010 1001 (= 41). Die Prüfung
0000 1000 And 0010 1001 -------------- = 0000 1000
ergibt nicht Nnull, das Attribut ist also gesetzt. Um aus einer Datei ein bestimmtes Attribut herauszufiltern, beispielsweise Hidden, gehen wir daher wie folgt vor:
Dim f As New FileInfo("C:\Testfile.txt") If 0 <> (f.Attributes And FileAttributes.Hidden) Then ... ' versteckte Datei
Zum Setzen verwenden wir den Or-Operator:
f.Attributes = f.Attributes Or FileAttributes.Hidden
In gleicher Weise können Sie mit den Methoden GetAttributes und SetAttributes der Klasse File arbeiten.
Methoden
Die Klassen File und FileInfo sind sich sehr ähnlich: Es lassen sich Dateien löschen, verschieben, umbenennen, kopieren, öffnen usw. (siehe Tabelle 7.7). Die meisten geben ein Stream-Objekt für weitergehende Operationen zurück.
Methode | Rückgabetyp | Beschreibung |
AppendText |
StreamWriter |
Hängt Text an eine existierende Datei an. |
CopyTo |
FileInfo |
Kopiert die Datei an einen anderen Speicherort. |
Create |
FileStream |
Erzeugt eine Datei. |
CreateText |
StreamWriter |
Erzeugt eine neue Textdatei. |
Delete |
Löscht die Datei. |
|
Exists |
Boolean |
Gibt an, ob die Datei existiert. |
MoveTo |
Verschiebt die Datei in einen anderen Ordner oder benennt sie um. |
|
Open |
FileStream |
Öffnet eine Datei. |
OpenRead |
FileStream |
Öffnet eine Datei zum Lesen. |
OpenText |
StreamReader |
Öffnet eine Textdatei zum Lesen. |
OpenWrite |
FileStream |
Öffnet eine Datei zum Schreiben. |
7.3.3 Die Klassen Directory und DirectoryInfo
Analog zu den Dateiklassen enthält Directory nur klassengebundene Methoden, während DirectoryInfo auf einer konkreten Instanz basiert. Der entscheidende Unterschied besteht in der internen Arbeitsweise. Zugriffe auf das Dateisystem setzen immer operative Berechtigungen voraus. Verfügt der Anwender nicht über die entsprechenden Rechte, wird die angeforderte Aktion abgelehnt. Die beiden Klassen File und Directory prüfen das bei jedem Zugriff erneut und belasten so das System unnötig, während die Überprüfung von den Klassen DirectoryInfo und FileInfo nur einmal ausgeführt wird.
Mit Directory kann man Ordner anlegen, löschen oder verschieben, die in einem Verzeichnis physikalisch gespeicherte Dateinamen abrufen und verzeichnisspezifische Eigenschaften sowie das Erstellungsdatum oder das Datum des letzten Zugriffs ermitteln (siehe Tabelle 7.8).
Methode | Beschreibung |
CreateDirectory |
Erzeugt ein Verzeichnis oder Unterverzeichnis. |
Delete |
Löscht ein Verzeichnis. |
Exists |
Überprüft, ob das angegebene Verzeichnis existiert. |
GetCreationTime |
Liefert das Erstellungsdatum samt Uhrzeit. |
GetDirectories |
Liefert die Namen aller Unterverzeichnisse eines spezifizierten Ordners. |
GetFiles |
Liefert alle Dateinamen eines spezifizierten Ordners. |
GetFileSystemEntries |
Liefert die Namen aller Unterverzeichnisse und Dateien eines spezifizierten Ordners. |
GetParent |
Liefert den Namen des übergeordneten Verzeichnisses. |
Move |
Verschiebt ein Verzeichnis samt Dateien. |
SetCreationTime |
Legt Datum und Uhrzeit eines Verzeichnisses fest. |
Die Fähigkeiten der Klasse DirectoryInfo ähneln denen von Directory, setzen jedoch ein konkretes Objekt für den Zugriff auf die Elementfunktionen voraus.
7.3.4 Dateizugriffe in Aktion
Im folgenden Beispiel werden einige Methoden und Eigenschaften der Klassen File, FileInfo und Directory benutzt. Das Programm fordert den Anwender dazu auf, an der Konsole ein beliebiges Verzeichnis anzugeben, dessen Unterverzeichnisse und Dateien ermittelt und unter Angabe der Dateigröße und der Dateiattribute an der Konsole ausgegeben werden.
'...\IO\Dateien\Dir.vb |
Option Strict On Imports System.IO Namespace EA Module Dir Sub Test() Console.Write("Zu durchsuchender Ordner ") Dim dir As String = Console.ReadLine() ' Pfad muss mit \ enden If dir.Substring(dir.Length – 1) <> "\" Then dir += "\" For Each el As String In Directory.GetFileSystemEntries(dir) If 0 = (File.GetAttributes(el) And FileAttributes.Directory) Then Dim datei As New FileInfo(el) Console.WriteLine("{0,-30}{1,25} kB {2,-10} ", _ el.Substring(dir.Length – 1), datei.Length / 1024, _ GetFileAttributes(datei)) Else Console.WriteLine("{0,-30}{1,-15}", _ el.Substring(dir.Length), "Dateiordner") End If Next Console.ReadLine() End Sub Function GetFileAttributes(ByVal datei As FileInfo) As String Dim attr As String = "" Dim tp As Type = GetType(FileAttributes) For Each fa As FileAttributes In [Enum].GetValues(tp) If 0 <> (fa And datei.Attributes) Then _ attr += [Enum].GetName(tp, fa).Substring(0, 1) Next Return attr End Function End Module End Namespace
Eine typische Ausgabe zeigt Abbildung 7.2.
Abbildung 7.2 Beispielausgabe mit »Dir«
Die Pfadangabe des Anwenders wird immer mit einem Backslash abgeschlossen, damit die Ausgabe immer gleich aussieht (Substring kappt den kompletten Pfad). In einer Schleife werden die von GetFileSystemEntries gelieferten Verzeichniseinträge durchlaufen. Jeder Eintrag kann sowohl eine Datei- als auch eine Verzeichnisangabe enthalten. Handelt es sich um ein Verzeichnis, ist das Attribut Directory gesetzt. Mit
If 0 = (File.GetAttributes(el) And FileAttributes.Directory) Then
wird das geprüft. Die Bedingung liefert True, wenn eine Datei vorliegt.
Da das Programm die Größe der Datei ausgeben soll, können wir nicht mit File arbeiten, da mit ihr keine Dateilänge ermittelt werden kann. Deswegen erledigt die Eigenschaft Length der Klasse FileInfo den Job.
Die Methode GetAttributes dient dazu, das übergebene FileInfo-Objekt auf die Attribute Hidden, ReadOnly, Archive und System hin zu untersuchen. Aus dem Ergebnis wird eine Zeichenfolge zusammengesetzt.
7.3.5 Pfade mit Path
Die Klassen File und Directory greifen immer wieder auf Pfadangaben zurück. Eine Pfadangabe beschreibt den Ort einer Datei oder eines Verzeichnisses. Die Schreibweise ist betriebssystemabhängig; manche starten mit einer Laufwerksangabe. Das Trennzeichen zwischen Verzeichnissen ist ebenfalls plattformspezifisch. Windows benutzt in der Regel den Backslash (\), Unix einen Slash (/). Die nicht ableitbare Klasse Path ermöglicht plattformunabhängige Pfadangaben. Außerdem kann sie eine Pfadangabe in ihre Bestandteile zerlegen. Schließlich gibt uns Path das Verzeichnis für temporäre Dateien.
Methoden
Alle Path-Klassenmitglieder sind klassengebunden und haben die Aufgabe, eine Pfadangabe in einer bestimmten Weise zu filtern (siehe Tabelle 7.9).
Methode | Beschreibung |
GetDirectoryName |
Das Verzeichnis einer gegebenen Pfadangabe |
GetExtension |
Dateierweiterung einschließlich des führenden Punktes |
GetFileName |
Liefert den vollständigen Dateinamen. |
GetFileNameWithoutExtension |
Liefert den Dateinamen ohne Dateierweiterung. |
GetFullPath |
Liefert die komplette Pfadangabe. |
GetPathRoot |
Liefert das Stammverzeichnis. |
Beachten Sie dabei, dass keine dieser Methoden testet, ob die Datei oder das Verzeichnis tatsächlich existiert. Es werden lediglich die Zeichenkette und die Vorschriften der spezifischen Plattform zur Bestimmung des Ergebnisses herangezogen. Mit
Dim strPath As String = "C:\winnt\system\OLE2.dll"
liefern die Methoden die folgenden Rückgaben:
Console.WriteLine(Path.GetPathRoot(strPath)) ' C:\ Console.WriteLine(Path.GetDirectoryName(strPath)) ' C:\winnt\system Console.WriteLine(Path.GetFileNameWithoutExtension(strPath)) ' OLE2 Console.WriteLine(Path.GetFileName(strPath)) ' OLE2.dll Console.WriteLine(Path.GetFullPath(strPath)) ' C:\winnt\system\OLE2.dll Console.WriteLine(Path.GetExtension(strPath)) ' .dll
Temporäre Verzeichnisse
Viele Anwendungen arbeiten mit temporären Dateien. Die Methode GetTempPath der Klasse Path liefert das temporäre Verzeichnis des aktuell angemeldeten Benutzers.
Public Shared Function GetTempPath() As String |
Unter Windows XP finden Sie dieses Verzeichnis standardmäßig unter dem Namen Temp in:
C:\Dokumente und Einstellungen\Username\Lokale Einstellungen
Mit GetTempFileName wird eine leere Datei im temporären Verzeichnis angelegt. Der Rückgabewert ist die komplette Pfadangabe:
Public Shared Function GetTempFileName() As String |
Eine temporäre Datei kann dazu benutzt werden, Zwischenergebnisse zu speichern, Informationen kurzfristig zu sichern und Abläufe zu protokollieren. Allerdings sollten Sie nicht vergessen, temporäre Dateien nach Gebrauch auch wieder zu löschen.
7.3.6 Laufwerksinformation mit DriveInfo
Mit DriveInfo können Sie bestimmen, welche Laufwerke verfügbar sind und um welchen Typ von Laufwerk es sich dabei handelt. Zudem können Sie die Kapazität und den verfügbaren freien Speicherplatz auf dem Laufwerk ermitteln. Tabelle 7.10 listet die Eigenschaften von DriveInfo auf.
Eigenschaft | Rückgabetyp | Beschreibung |
AvailableFreeSpace |
Long |
Freier Speicherplatz auf einem Laufwerk |
DriveFormat |
String |
Ruft den Namen des Dateisystems ab. |
DriveType |
DriveType |
Ruft den Laufwerkstyp ab. |
IsReady |
Boolean |
Gibt an, ob das Laufwerk bereit ist. |
Name |
String |
Liefert den Namen des Laufwerks. |
RootDirectory |
DirectoryInfo |
Liefert das Stammverzeichnis des Laufwerks. |
TotalFreeSpace |
Long |
Liefert den verfügbaren Speicherplatz. |
TotalSize |
Long |
Gesamter Speicherplatz auf einem Laufwerk |
VolumeLabel |
String |
Datenträgerbezeichnung eines Laufwerks |
Die Eigenschaft DriveType ist vom Typ der gleichnamigen Enumeration. Diese hat insgesamt sieben Mitglieder, die Sie der Tabelle 7.11 entnehmen können.
Member | Beschreibung |
CDRom |
Optischer Datenträger (z. B. CD oder DVD) |
Fixed |
Festplatte |
Network |
Netzlaufwerk |
NoRootDirectory |
Das Laufwerk hat kein Stammverzeichnis. |
Ram |
RAM-Datenträger |
Removable |
Wechseldatenträger |
Unknown |
Unbekannter Laufwerkstyp |
7.3.7 SpecialDirectories
My.Computer.FileSystem.SpecialDirectories listet Windows-spezifischer Pfade, zum Beispiel den zu Eigene Bilder. Die Angaben werden über die in Tabelle 7.12 gezeigten statischen Eigenschaften als Zeichenfolge geliefert.
Eigenschaft | Beschreibung |
AllUserApplicationData |
Anwendungsdaten aller Benutzer, typischerweise \Dokumente und Einstellungen\All Users\ Anwendungsdaten. |
CurrentUserApplicationData |
Anwendungsdaten des aktuellen Benutzers |
Desktop, MyDocuments, MyMusic, MyPictures, ProgramFiles, Programs, Temp |
Pfad zu Desktop, Eigene Dateien, Eigene Musik, Eigene Bilder, Program Files, Programme, Temp. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.