VB.NET Tipps: Dateien und Verzeichnisse Teil 2

Veröffentlicht: 21. Sep 2005

Auszug aus dem Buch "Microsoft Visual Basic .NET - Programmier-Rezepte - Hunderte von Lösungen und Codebeispielen aus der Praxis"

Das nächste Mal, wenn Sie auf ein Problem in Ihrem Visual Basic .NET-Code stoßen, werfen Sie doch einen Blick in dieses Buch. Hier finden Sie Lösungen und erprobte Techniken.

´Microsoft Visual Basic .NET Programmierrezepte´ ist Ihre Quelle für Hunderte von Visual Basic .NET-Szenarien, die mit Hilfe eines durchgängigen Problem-/Lösungs-Ansatzes erläutert und gelöst werden. Der logische Aufbau des Buchs erlaubt Ihnen, schnell zu den Themen zu gelangen, die Sie interessieren.

Hier finden Sie praktische Beispiele, Code-Schnipsel, erprobte Lösungswege und undokumentierte Vorgehensweisen, die Ihnen helfen, Ihre Arbeit schnell und gut zu erledigen.

Sämtliche Codebeispiele sind von der Microsoft Press-Website downloadbar.

Microsoft Press


Diesen Artikel können Sie dank freundlicher Unterstützung von Microsoft Press auf MSDN Online lesen. Microsoft Press ist ein Partner von MSDN Online.


Zur Partnerübersichtsseite von MSDN Online

Die Rezepte im zweiten Teil beschreiben unter anderem das isolierte Speichern, mit dem die Dateierstellung in nicht sicheren Umgebungen möglich ist . Sie erhalten sogar Informationen, die als Ausgangspunkt für die Arbeit mit einigen speziellen Formaten dienen. Dazu zählen MP3-Dateien und ZIP-Dateien.

Auf dieser Seite

 Eine temporäre Datei erstellen
 Den Pfad der ausführbaren Datei abrufen
 Den aktuellen Arbeitspfad setzen
 Einen isolierten Speicher verwenden
 Anwendungskonfigurationseinstellungen lesen
 Benutzerdefinierte Konfigurationsabschnitte erstellen
 Die Header-Informationen einer MP3-Datei lesen
 Mit ZIP-Dateien arbeiten
 Mit PDF-Dateien arbeiten

Eine temporäre Datei erstellen

Aufgabe
Sie möchten einen Dateinamen abrufen, den Sie für eine temporäre Datei verwenden können.

Lösung
Benutzen Sie die freigegebene Methode Path.GetTempFileName.

Beschreibung

Es gibt verschiedene Möglichkeiten, um temporäre Dateien zu erstellen. Im einfachsten Fall erstellen Sie im Anwendungsverzeichnis einfach eine Datei und benutzen hierfür beispielsweise einen GUID-Dateinamen oder ein Datum in Verbindung mit einer Zufallszahl. Die Klasse System.IO.Path stellt jedoch eine Hilfsmethode zur Verfügung, mit der Sie sich ein wenig Arbeit sparen können. Sie gibt einen (im aktuellen temporären Verzeichnis des Benutzers) eindeutigen Dateinamen zurück, den Sie benutzen können, um eine Datei zu erstellen, die temporäre Informationen speichert. Dabei handelt es sich um einen Pfad in der Form c:\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen\temp\tmpac9.tmp.

Dim TempFile As String = Path.GetTempFileName()
Console.WriteLine("Benutze " & TempFile)

Dim fs As New FileStream(TempFile, FileMode.Create)

' (Einige Daten schreiben.)

fs.Close()

' Datei löschen.
File.Delete(TempFile)

Wenn Sie GetTempFileName mehrmals aufrufen, erhalten Sie jedes Mal einen anderen Dateinamen. Dies gilt auch dann, wenn Sie keine Datei mit dem jeweiligen Namen erstellen. Dieses System wurde entwickelt, um Namenskonflikte zwischen verschiedenen Anwendungen zu vermeiden.

 

Den Pfad der ausführbaren Datei abrufen

Aufgabe
Sie möchten den Pfad abrufen, in dem die aktuell ausführbare Datei gespeichert ist.

Lösung
Lesen Sie die freigegebene Eigenschaft StartupPath der Klasse System.Windows.Forms.Application aus.

Beschreibung

Mit der Klasse System.Windows.Forms.Application können Sie das Verzeichnis abrufen, in dem die ausführbare Datei gespeichert ist. Dies ist auch dann möglich, wenn es sich nicht um eine Windows-Anwendung handelt.

Console.Write("Ausführbare Datei ist: ")
Console.WriteLine(System.Windows.Forms.Application.ExecutablePath)
Console.Write("Datei wird ausgeführt in: ")
Console.WriteLine(System.Windows.Forms.Application.StartupPath)

Um diese Technik einsetzen zu können, müssen Sie den Namespace System.Windows.Forms referenzieren. Alternativ hierzu können Sie den aktuellen Arbeitspfad ermitteln oder die Reflektion benutzen, um den Ort abzurufen, an dem sich die Codebasis der gegenwärtig ausgeführten Assembly befindet.

 

Den aktuellen Arbeitspfad setzen

Aufgabe
Sie möchten das aktuelle Arbeitsverzeichnis setzen, so dass Sie in Ihrem Code relative Pfade verwenden können.

Lösung
Benutzen Sie die freigegebene Methoden Directory.GetCurrentDirectory und Directory.SetCurrentDirectory.

Beschreibung

Relative Pfade werden basierend auf dem aktuellen Arbeitsverzeichnis interpretiert. Sie können das aktuelle Arbeitsverzeichnis mit Directory.GetCurrentDirectory abrufen. Um es zu ändern, verwenden Sie Directory.SetCurrentDirectory. Darüber hinaus können Sie die freigegebene Methode Path.GetFullPath benutzen, um einen relativen Pfad, basierend auf dem aktuellen Arbeitsverzeichnis, in einen absoluten Pfad zu konvertieren.

Der folgende Code demonstriert diese Konzepte:

Console.WriteLine("Benutze: " & Directory.GetCurrentDirectory())
Console.Write("Der relative Pfad myfile.txt will wird automatisch zu ")
Console.WriteLine(Path.GetFullPath("myfile.txt"))

Console.WriteLine("Das aktuelle Verzeichnis ändern in c:\")
Directory.SetCurrentDirectory("c:\")
Console.Write("Der relative Pfad myfile.txt wird automatisch zu ")
Console.WriteLine(Path.GetFullPath("myfile.txt"))

Eine mögliche Ausgabe dieses Codes ist nachfolgend aufgeführt:

Benutze: D:\temp\Chapter 05\Recipe 5-14\bin
Der relative Pfad myfile.txt will wird automatisch zu D:\temp\Chapter 05\Recipe
5-14\bin\myfile.txt
Das aktuelle Verzeichnis ändern in c:\
Der relative Pfad myfile.txt wird automatisch zu c:\myfile.txt

HINWEIS:
Wenn Sie relative Pfade benutzen, sollten Sie den Arbeitspfad zu Beginn jeder Dateiinteraktion setzen. Sie könnten andernfalls, ohne Notiz davon zu nehmen, Sicherheitslücken schaffen, die es einem böswilligen Benutzer erlauben würden, über Ihre Anwendung auf Systemdateien zu zugreifen oder diese zu überschreiben. Dazu müsste der Benutzer lediglich ein anderes Arbeitsverzeichnis einstellen.

 

Einen isolierten Speicher verwenden

Aufgabe
Sie möchten Daten in einer Datei speichern, doch Ihre Anwendung wird nicht mit der erforderlichen Berechtigung FileIOPermission ausgeführt.

Lösung
Verwenden Sie einen benutzerspezifischen isolierten Speicher.

Beschreibung

Das .NET Framework unterstützt isolierte Speicher, mit denen Sie in ein benutzerspezifisches virtuelles Dateisystem schreiben (und daraus lesen) können, das von der CLR (Common Language Runtime) verwaltet wird. Wenn Sie isolierte Speicherdateien erstellen, werden die Daten automatisch in ein Verzeichnis mit einem eindeutigen Namen serialisiert, das sich im Benutzerprofilpfad befindet - dies ist in der Regel der Pfad:

c:\Dokumente und Einstellungen\[benutzername]\Lokale Einstellungen\Anwendungsdaten\ IsolatedStorage\[guid_bezeichner]).

Ein Grund für den Einsatz eines isolierten Speichers könnte darin bestehen, einer nicht vertrauenswürdigen Anwendung die eingeschränkte Möglichkeit zu bieten, Daten zu speichern. Die Sicherheitsrichtlinie der CLR (Common Language Runtime) vergibt beispielsweise die Berechtigung FileIOPermission an lokalen Code, so dass dieser jede beliebige Datei öffnen oder schreiben kann. Code, den Sie von einem Remote-Server aus im lokalen Intranet ausführen, erhält diese Berechtigung nicht. Er verfügt jedoch über die Berechtigung IsolatedStoragePermission, die es ihm ermöglicht, isolierten Speicher zu verwenden. (Die Sicherheitsrichtlinie begrenzt auch den maximalen Speicherplatz, der für einen isolierten Speicher verwendet werden kann.) Ein weiterer Grund, der Sie dazu bewegen könnte, einen isolierten Speicher zu verwenden, ist der bessere Schutz von Daten. Daten, die sich beispielsweise im isolierten Speicher eines Benutzers befinden, sind für einen anderen Benutzer nicht verfügbar, sofern dieser kein Administrator ist. Außerdem ist es für einen Angreifer nicht einfach, isolierte Daten zu finden, die einer bestimmten Anwendung zugeordnet sind. Und dies obwohl die isolierten Speicher in Verzeichnissen abgelegt werden, deren Namen GUID-Bezeichner sind.

Das folgende Beispiel zeigt, wie Sie auf einen isolierten Speicher zugreifen. Es geht davon aus, dass Sie den Namespace System.IO.IsolatedStoarge importiert haben.

' Den Speicher für den aktullen Benutzer erstellen.
Dim Store As IsolatedStorageFile
Store = IsolatedStorageFile.GetUserStoreForAssembly()

' Einen Ordner im Stammverzeichnis des isolierten Speichers erstellen.
Store.CreateDirectory("MyFolder")

' Eine Datei im isolierten Speicher erstellen.
Dim Stream As New IsolatedStorageFileStream( _
    "MyFile.txt", FileMode.Create, Store)

Dim w As New StreamWriter(Stream)

' (Sie können nun wie gewohnt in die Datei schreiben.)

w.Close()

HINWEIS:
Sie können ebenfalls Methoden wie IsolatedStorageFile.GetFileNames und IsolatedStorageFile.GetDirectoryNames benutzen, um die Inhalte eines isolierten Speichers aufzulisten.

Für jeden Benutzer und jede Assembly wird jeweils ein isolierter Speicher erstellt. Wenn somit derselbe Benutzer dieselbe Anwendung wiederholt ausführt, greift die Anwendung immer auf denselben isolierten Speicher zu. Sie können jedoch angeben, dass auch für jede Anwendungsdomäne ein isolierter Speicher erstellt werden muss, so dass mehrere Instanzen derselben Anwendung verschiedene isolierte Speicher erhalten.

' Auf den isolierten Speicher für den aktuellen Benutzer und die Assembly zugreifen
' (entspricht dem ersten Beispiel).
Store = New IsolatedStorageFile.GetStore(IsolatedStorageScope.User Or _
  IsolatedStorageScope.Assembly, Nothing, Nothing)

' Auf den isolierten Speicher für den aktuellen Benutzer, die Assembly
' und die Anwendungsdomäne zugreifen. Diese Daten sind somit nur
' für aktuelle Anwendungsinstanz verfügbar.
Store = New IsolatedStorageFile.GetStore(IsolatedStorageScope.User Or _
  IsolatedStorageScope.Assembly Or IsolatedStorageScope.Domain, _
  Nothing, Nothing)

Die Dateien werden als Bestandteil des Benutzerprofils gespeichert, so dass die Benutzer an jeder Workstation, an der sie sich anmelden, auf ihre isolierten Speicher zugreifen können, sofern in Ihrem LAN servergespeicherte Profile konfiguriert sind. Wenn Sie die vom .NET Framework und der CLR zur Verfügung gestellten Isolierungsebenen verwenden, sind Sie nicht mehr für die Verwaltung der gesonderten Dateien verantwortlich und müssen sich keine Gedanken darüber machen, ob Sie etwas übersehen oder missverstanden haben, das zu einem Verlust wichtiger Daten führen könnte.

 

Anwendungskonfigurationseinstellungen lesen

Aufgabe
Sie möchten einfach zu modifizierende, anwendungsspezifische Einstellungen speichern, ohne den Code erneut kompilieren zu müssen.

Lösung
Rufen Sie die Einstellungen aus einer Anwendungskonfigurationsdatei ab.

Beschreibung

Konfigurationsdateien sind ideale Speicher für Informationen, wie zum Beispiel Verzeichnispfade und Datenbankverbindungszeichenfolgen. Eine Besonderheit von Konfigurationsdateien besteht darin, dass sie an ein bestimmtes Verzeichnis und nicht (wie Registrierungseinstellungen) an einen bestimmten Computer gebunden sind. Wenn somit mehrere Clients dieselbe Anwendung aus demselben Verzeichnis laden, benutzen sie dieselben benutzerdefinierten Einstellungen. Sie müssen jedoch möglicherweise zusätzliche Sicherheitseinstellungen hinzufügen, um zu verhindern, dass die Benutzer eine Konfigurationsdatei, die auf diese Weise gemeinsam genutzt wird, lesen oder modifizieren.

Um eine Konfigurationsdatei für Ihre Anwendung zu erstellen, geben Sie der Datei denselben Namen wie Ihre Anwendung. Als Dateiendung verwenden Sie .config. Die Konfigurationsdatei einer Anwendung namens MyApp.exe würde somit MyApp.config heißen. Einzige Ausnahme bilden Webanwendungen, Webseiten und Webdienste, die Microsoft ASP.NET und die IIS (Internet Information Services) nutzen. In diesen Fällen benutzt ASP.NET immer eine Datei namens web.config, die sich im entsprechenden virtuellen Verzeichnis befindet.

HINWEIS:
Visual Studio .NET vereinfacht die Erstellung von Konfigurationsdateien. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das gewünschte Projekt, und wählen Sie im anschließend angezeigten Kontextmenü den Befehl Hinzufügen/Neues Element hinzufügen. Wählen Sie anschließend im Knoten Lokale Projektelemente den Eintrag Anwendungskonfigurationsdatei.

Der Anwendungskonfigurationsdatei wird automatisch der Name app.config zugewiesen. Sie sollten den Namen nicht ändern. Wenn Visual Studio Ihr Projekt kompiliert, generiert es die Konfigurationsdatei im entsprechenden Verzeichnis und mit dem richtigen Namen. Auf diese Weise können Sie den Assembly-Namen Ihrer Anwendung zur Entwurfszeit ändern, ohne den Namen der entsprechenden Konfigurationsdatei ändern zu müssen.

Sie können einer Konfigurationsdatei eine beliebige Anzahl von Name-/Wertpaaren hinzufügen. Sie fügen diese Einstellungen mithilfe von <add>-Elementen dem <appSettings>-Abschnitt der Datei hinzu. Jede benutzerdefinierte Einstellung besteht aus einem Zeichenfolgenwert und einem eindeutigen Zeichenfolgenschlüssel, der den Wert identifiziert. Nachfolgend ist eine Konfigurationsdatei mit einer benutzerdefinierten Einstellung (namens CustomPath) aufgeführt:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="CustomPath"
         value="c:\Temp\MyFiles" />
  </appSettings>

  <!-- Andere Konfigurationsabschnitte können hier eingefügt werden,
       sind aber nicht notwendig. -->

</configuration>

Sie können benutzerdefinierte Einstellungen über die Klasse System.ConfigurationSettings abrufen. Sie verwenden dazu den jeweiligen Schlüssel. Die Einstellungen werden immer als Zeichenfolgen abgerufen. Der folgende Code-Schnipsel geht davon aus, dass Sie den Namespace System.Configuration importiert haben.

' Benutzerdefinierte Pfadeinstellungen abrufen.
Dim MyPath As String
MyPath = System.Configuration.ConfigurationSettings.AppSettings("CustomPath")
' MyPath ist nun "c:\Temp\MyFiles".

Wenn Sie mehrere zusammengehörige Einstellungen in einer Konfigurationsdatei speichern möchten, können Sie einen benutzerdefinierten Konfigurationsabschnitt und einen benutzerdefinierten Abschnittsleser erstellen.

HINWEIS:
Wenn eine Klassenbibliothek die Klasse AppSettings benutzt, wird sie auf die Konfigurationsdatei zugreifen, die von der ausführbaren Anwendung geladen wurde. Wenn somit die Anwendung MyApp.exe die Assembly MyLib.dll lädt, wird jeder Zugriff auf die Konfigurationsdatei, der in MyLib.dll stattfindet, an die Datei MyApp.exe.config weitergeleitet.

 

Benutzerdefinierte Konfigurationsabschnitte erstellen

Aufgabe
Sie möchten einen benutzerdefinierten Konfigurationsabschnitt benutzen, um zusammengehörige benutzerdefinierte Einstellungen zu gruppieren.

Lösung
Registrieren Sie Ihre benutzerdefinierten Einstellungen mit der Klasse System.Configuration.NameValueSectionHandler. Sie können anschließend die Methode ConfigurationSettings.GetConfig benutzen, um aus dem Abschnitt eine Einstellungsauflistung abzurufen.

Beschreibung

.NET verwendet ein erweiterbares System von Konfigurationsdateieinstellungen. Ihnen stehen verschiedene Möglichkeiten zur Verfügung, um aus einer Konfigurationsdatei benutzerdefinierte Einstellungen zu lesen:

  • Ordnen Sie Ihre benutzerdefinierten Einstellungen in der Gruppe <appSettings> an, und greifen Sie über die Auflistung ConfigurationSettings.AppSettings auf diese Einstellungen zu.

  • Erstellen Sie Ihren eigenen benutzerdefinierten Abschnitts-Handler, indem Sie IConfigurationSectionHandler implementieren und in der Konfigurationsdatei registrieren. Diese Technik ist besonders flexibel, wird aber nur selten benötigt.

  • Ordnen Sie Ihre Konfigurationseinstellungen in einer benutzerdefinierten Gruppe an, und registrieren Sie einen vorgefertigten Konfigurationsabschnittsleser, wie zum Beispiel NameValueSectionHandler oder SingleTagSectionHandler. Dies ist das in diesem Abschnitt verwendete Verfahren.

Um NameValueSectionHandler zu benutzen, sollten Sie zunächst die Gruppe mit den benutzerdefinierten Einstellungen erstellen und diese Ihrer Konfigurationsdatei hinzufügen. Das folgende Beispiel enthält einen benutzerdefinierten Abschnitt namens <mySection>, der sich in der Gruppe <mySectionGroup> befindet. Dieser Abschnitt weist nur eine Einstellung auf, die mit key1 bezeichnet ist.

<mySectionGroup>
    <mySection>
        <add key="key1" value="value1" />
    </mySection>
</mySectionGroup>

Ihre nächste Aufgabe besteht darin, den Abschnitt für die Verarbeitung durch den Handler NameValueSectionHandler zu registrieren, den Sie über seinen starken Namen identifizieren. Beachten Sie, dass alle im folgenden Code gezeigten Informationen in eine einzige Zeile eingegeben werden müssen. Der hier verwendete Zeilenumbruch dient lediglich der Übersichtlichkeit.

<configuration>
    <configSections>
        <sectionGroup name="mySectionGroup">
            <section name="mySection"
             type="System.Configuration.NameValueSectionHandler,system,
             Version=1.0.3300.0, Culture=neutral,
             PublicKeyToken=b77a5c561934e089, Custom=null" />
        </sectionGroup>
    </configSections>

   <mySectionGroup>
        <mySection>
            <add key="key1" value="value1" />
        </mySection>
    </mySectionGroup>

</configuration>

Abhängig von der .NET-Version, die Sie installiert haben, müssen Sie möglicherweise die Versionsinformationen modifizieren, die sich im type-Abschnitt des Tags <sectionGroup> befinden. Wenn Sie die Version der Assembly System.dll ermitteln möchten, können Sie die GAC-Erweiterung (Global Assembly Cache) des Windows Explorers verwenden.

Sobald Sie die Änderung durchgeführt haben, ist das Abrufen der benutzerdefinierten Informationen nicht mehr schwierig. Sie importieren zunächst zwei Namespaces in Ihre Anwendung:

Imports System.Configuration
Imports System.Collections.Specialized

Danach benutzen Sie einfach die Methode ConfigurationSettings.GetConfig, die alle Einstellungen eines Abschnitts in einer Auflistung zurückgibt. Sie übergeben diesen Abschnitt der GetConfig-Methode mit einer pfadähnlichen Syntax.

Dim Settings As NameValueCollection
Settings = CType( _
    ConfigurationSettings.GetConfig("mySectionGroup/mySection"), _
    NameValueCollection)

' "value1" anzeigen
Console.WriteLine(Settings("key1"))

 

Die Header-Informationen einer MP3-Datei lesen

Aufgabe
Sie möchten aus einer MP3-Datei Informationen über das Musikstück, den Künstler und das Album lesen.

Lösung
Lesen Sie das ID3v2-Tag aus, das sich am Ende der MP3-Datei befindet.

Beschreibung

Die meisten MP3-Dateien speichern Informationen am Ende der Datei in einem 128 Bytes großen ID3v2-Tag. Dieses Tag beginnt mit dem Wort TAG und enthält Informationen im
ASCII-Format über den Künstler, das Album und das Musikstück. Sie können diese Daten mit dem Encoding-Objekt, das von der System.Text.Encoding.ASCII-Eigenschaft zurückgegeben wird, in eine Zeichenfolge umwandeln.

Die nachfolgend aufgeführte Klasse MP3TagData ermöglicht den Zugriff auf MP3-Daten und stellt eine ReadFromFile-Methode zur Verfügung, die Informationen aus einer gültigen MP3-Datei abruft.

Public Class MP3TagData

    Private _Artist As String
    Private _SongTitle As String
    Private _Album As String
    Private _Year As String

    Public ReadOnly Property Artist() As String
        Get
            Return _Artist
        End Get
    End Property

    Public ReadOnly Property SongTitle() As String
        Get
            Return _SongTitle
        End Get
    End Property

    Public ReadOnly Property Album() As String
        Get
            Return _Album
        End Get
    End Property

    Public ReadOnly Property Year() As String
        Get
            Return _Year
        End Get
    End Property

    Public Sub ReadFromFile(ByVal filename As String)
        ' Bereits vorhandene Werte löschen.
        Me._SongTitle = ""
        Me._Artist = ""
        Me._Album = ""
        Me._Year = ""

        Dim fs As New FileStream(filename, FileMode.Open)

        ' MP3-Tag lesen.
        fs.Seek(0 - 128, SeekOrigin.End)

 
        Dim Tag(2) As Byte
        fs.Read(Tag, 0, 3)

        ' Überprüfen, ob ein Tag vorhanden ist.
        If System.Text.Encoding.ASCII.GetString(Tag).Trim() = "TAG" Then
            ' Titel.
            Me._SongTitle = GetTagData(fs, 30)
            ' Künstler.
            Me._Artist = GetTagData(fs, 30)
            ' Album.
            Me._Album = GetTagData(fs, 30)
            ' Jahr. 
            Me._Year = GetTagData(fs, 4)

        End If

        fs.Close()
    End Sub

    Private Function GetTagData(ByVal stream As Stream, _
      ByVal length As Integer) As String

        ' Daten lesen.
        Dim Bytes(length - 1) As Byte
        stream.Read(Bytes, 0, length)

        Dim TagData As String = System.Text.Encoding.ASCII.GetString(Bytes)

        ' Nullen abschneiden.
        Dim TrimChars() As Char = {Char.Parse(" "), Char.Parse(vbNullChar)}
        TagData = TagData.Trim(TrimChars)
        Return TagData

    End Function

End Class

HINWEIS:
Die Daten im MP3-Tag weisen immer eine feste Größe auf und werden mit Nullen aufgefüllt. Sie müssen diese Null-Zeichen manuell von der Zeichenfolge abschneiden. Sie könnten andernfalls mit Problemen konfrontiert werden, wenn Sie die Zeichenfolge in Ihrer Anwendung benutzen.

Der folgende Code zeigt, wie Sie die MP3TagData-Klasse benutzen können, um MP3-Informationen abzurufen und anzuzeigen:

Dim MP3Tag As New MP3TagData()
MP3Tag.ReadFromFile("c:\mp3\mysong.mp3")

Console.WriteLine("Album: " & MP3Tag.Album)
Console.WriteLine("Künstler: " & MP3Tag.Artist)
Console.WriteLine("Musikstück: " & MP3Tag.SongTitle)
Console.WriteLine("Jahr: " & MP3Tag.Year)

 

Mit ZIP-Dateien arbeiten

Aufgabe
Sie möchten mit komprimierten ZIP-Archiven arbeiten, entweder um Dateiinformationen aus einer ZIP-Datei abzurufen oder um einzelne Dateien zu komprimieren bzw. zu dekomprimieren.

Lösung
Benutzen Sie eine entsprechende .NET-Komponente, wie zum Beispiel das kostenlos erhältliche #ziplib.

Beschreibung

Es gibt mehrere kommerzielle Komponenten, die es Ihnen ermöglichen, mit ZIP-Dateien zu arbeiten. Es gibt jedoch auch eine kostenlose und voll funktionsfähige ZIP-Komponente, die Sie ohne Einschränkungen weitergeben dürfen: #ziplib (auch bekannt als SharpZipLib). Diese Komponente wurde von Mike Krueger entwickelt, der dazu eine Java-Open-Source-Komponente verwendete. Sie können #ziplib mit den Code-Beispielen zu diesem Buch oder von der Website http://www.icsharpcode.net/opensource/sharpziplib herunterladen. Diese Seite enthält auch Beispiele in Visual Basic und C# sowie eine kurze Dokumentation.

Um #ziplib in einem Projekt verwenden zu können, fügen Sie einen Verweis auf die Assembly SharpZipLib.dll hinzu und importieren den folgenden Namespace:

Imports ICSharpCode.SharpZipLib.Zip

Um Informationen über die Dateien in einem ZIP-Archiv abzurufen, können Sie einen ähnlichen Code wie den folgenden verwenden:

Dim ZipStream As New ZipInputStream(File.OpenRead("test.zip"))
Dim Entry As ZipEntry = ZipStream.GetNextEntry()

Do Until Entry Is Nothing
    Console.WriteLine("Name: " & Entry.Name)
    Console.WriteLine("Datum: " & Entry.DateTime.ToString())
    Console.WriteLine("Größe, unkomprimiert: " & Entry.Size.ToString())
    Console.WriteLine("Größe, komprimiert: " + Entry.CompressedSize.ToString())
    Console.WriteLine()
    Entry = ZipStream.GetNextEntry()
Loop

ZipStream.Close()

Nachfolgend ist ein Beispiel für die Ausgabe dieses Codes aufgeführt, die für ein ZIP-Archiv generiert wurde, das drei Dateien enthält:

Name: COPYING.txt
Datum: 12/07/2001 4:49:48 PM
Größe, unkomprimiert: 18349
Größe, komprimiert: 6956

Name: Documentation.chm
Datum: 15/07/2002 10:21:12 AM
Größe, unkomprimiert: 321684
Größe, komprimiert: 266795

Name: Readme.pdf
Datum: 25/07/2002 11:05:08 AM
Größe, unkomprimiert: 82763
Größe, komprimiert: 79186

Sie können #ziplib ebenfalls verwenden, um Dateien zu komprimieren oder zu dekomprimieren. Betrachten Sie dazu die Code-Beispiele, die mit der Komponente zur Verfügung gestellt werden.

 

Mit PDF-Dateien arbeiten

Aufgabe
Sie möchten Daten aus einer PDF-Datei lesen oder eine PDF-Datei programmgesteuert generieren.

Lösung
Arbeiten Sie mit einer Komponente eines Drittanbieters oder mit einer kostenlos erhältlichen Open-Source-Komponente von http://www.sourceforge.net.

Beschreibung

Das PDF-Dateiformat ist äußerst komplex und kann Daten wie zum Beispiel Bilder und Schriften einbetten. Um Informationen aus einer PDF-Datei abrufen zu können, müssen Sie die Komponente eines Drittanbieters benutzen. Es gibt einige kostenpflichtige Komponenten, aber auch zwei kostenlos erhältliche Komponenten, die von SourceForge heruntergeladen werden können. Dazu zählen die Report.NET-Bibliothek (http://sourceforge.net/projects/report) und die PDF.NET-Bibliothek (http://sourceforge.net/projects/pdflibrary).

Das Exportieren von Daten in eine PDF-Datei weist eine gewisse Ähnlichkeit mit einem Druckvorgang auf. Sie müssen explizit die Koordinaten des auszugebenden Textes und der Bilder angeben. Der folgende Code-Schnipsel zeigt ein sehr einfaches Beispiel für den Einsatz von Report.NET. Es erstellt eine kleine PDF-Datei. Dazu wird die aktuelle Version 0.06.01 verwendet. Um dieses Beispiel nachvollziehen zu können, müssen Sie einen Verweis auf die Assembly Reports.dll hinzufügen und den Namespace Root.Reports importieren.

' Die PDF-Datei erstellen.
Dim Doc As New Report(New PdfFormatter())

' Die Schriftinformationen definieren.
Dim FontDef As New FontDef(Doc, "Helvetica")
Dim FontProp As New FontPropMM(FontDef, 25)

' Eine neue Seite erstellen.
Dim PDFPage As New Page(Doc)

' Eine Textzeile hinzufügen.
PDFPage.AddCenteredMM(80, New RepString(FontProp, "Hello World!"))

' Dokument speichern.
Doc.Save("SimpleText.pdf")