Exemplarische Vorgehensweise: Bearbeiten von Dateien und Verzeichnissen in Visual Basic

Diese exemplarische Vorgehensweise enthält eine Einführung in die Grundlagen der Datei-E/A in Visual Basic. Es wird beschrieben, wie Sie eine kleine Anwendung erstellen können, in der Textdateien in einem Verzeichnis aufgelistet und überprüft werden. Die Anwendung stellt Dateiattribute und die erste Zeile des Inhalts jeder ausgewählten Textdatei zur Verfügung. Es besteht die Möglichkeit, Informationen in eine Protokolldatei zu schreiben.

In dieser exemplarischen Vorgehensweise werden Member von My.Computer.FileSystem Object verwendet, die unter Visual Basic verfügbar sind. Weitere Informationen finden Sie unter <xref:Microsoft.VisualBasic.FileIO.FileSystem>. Am Ende dieser exemplarischen Vorgehensweise finden Sie ein entsprechendes Beispiel, in dem Klassen aus dem Namespace <xref:System.IO> verwendet werden.

Hinweis

Auf Ihrem Computer werden möglicherweise andere Namen oder Speicherorte für die Benutzeroberflächenelemente von Visual Studio angezeigt als die in den folgenden Anweisungen aufgeführten. Diese Elemente sind von der jeweiligen Visual Studio-Version und den verwendeten Einstellungen abhängig. Weitere Informationen finden Sie unter Personalisieren der IDE.

So erstellen Sie das Projekt

  1. Klicken Sie im Menü Datei auf Neues Projekt.

    Das Dialogfeld Neues Projekt wird angezeigt.

  2. Erweitern Sie im Bereich Installierte Vorlagen Visual Basic, und klicken Sie dann auf Windows. Klicken Sie im Bereich Vorlagen auf Windows Forms-Anwendung.

  3. Geben Sie im Feld Name FileExplorer ein, um den Projektnamen festzulegen, und klicken Sie anschließend auf OK.

    Visual Studio fügt das Projekt zum Projektmappen-Explorer hinzu. Der Windows Forms-Designer wird geöffnet.

  4. Fügen Sie die Steuerelemente aus der folgenden Tabelle zum Formular hinzu, und legen Sie die entsprechenden Werte für die Eigenschaften fest.

    Steuerelement Eigenschaft Wert
    ListBox Name filesListBox
    Button (Schaltfläche) Name

    Text
    browseButton

    Browse (Durchsuchen)
    Button (Schaltfläche) Name

    Text
    examineButton

    Examine (Untersuchen)
    CheckBox Name

    Text
    saveCheckBox

    Save Results (Ergebnisse speichern)
    FolderBrowserDialog Name FolderBrowserDialog1

So wählen Sie einen Ordner und Listendateien in einem Ordner aus

  1. Erstellen Sie einen Click-Ereignishandler für browseButton, indem Sie auf ein Steuerelement im Formular doppelklicken. Der Code-Editor wird geöffnet.

  2. Fügen Sie dem Click-Ereignishandler den folgenden Code hinzu.

    If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
        ' List files in the folder.
        ListFiles(FolderBrowserDialog1.SelectedPath)
    End If
    

    Mit dem Aufruf FolderBrowserDialog1.ShowDialog wird das Dialogfeld Ordner suchen geöffnet. Sobald der Benutzer auf OK klickt, wird die <xref:System.Windows.Forms.FolderBrowserDialog.SelectedPath%2A>-Eigenschaft als Argument an die ListFiles-Methode gesendet, die im nächsten Schritt hinzugefügt wird.

  3. Fügen Sie die folgende ListFiles-Methode hinzu.

    Private Sub ListFiles(ByVal folderPath As String)
        filesListBox.Items.Clear()
    
        Dim fileNames = My.Computer.FileSystem.GetFiles(
            folderPath, FileIO.SearchOption.SearchTopLevelOnly, "*.txt")
    
        For Each fileName As String In fileNames
            filesListBox.Items.Add(fileName)
        Next
    End Sub
    

    Dieser Code löscht zuerst ListBox.

    Die <xref:Microsoft.VisualBasic.FileIO.FileSystem.GetFiles%2A>-Methode ruft anschließend eine Auflistung von Zeichenfolgen ab, eine für jede Datei im Verzeichnis. Die Methode GetFiles akzeptiert ein Suchmusterargument, um Dateien abzurufen, die mit einem bestimmten Muster übereinstimmen. In diesem Beispiel werden nur Dateien mit der Dateiendung „.txt“ zurückgegeben.

    Die Zeichenfolgen, die von der Methode GetFiles zurückgegeben werden, werden anschließend zu ListBox hinzugefügt.

  4. Führen Sie die Anwendung aus. Klicken Sie auf die Schaltfläche Durchsuchen. Navigieren Sie im Dialogfeld Ordner suchen zu einem Ordner, der .txt-Dateien enthält. Wählen Sie den Ordner anschließend aus, und klicken Sie auf OK.

    ListBox enthält eine Liste von .txt-Dateien im ausgewählten Ordner.

  5. Beenden Sie die Ausführung der Anwendung.

So rufen Sie Attribute einer Datei und Inhalt einer Textdatei ab

  1. Erstellen Sie einen Click-Ereignishandler für examineButton, indem Sie auf ein Steuerelement im Formular doppelklicken.

  2. Fügen Sie dem Click-Ereignishandler den folgenden Code hinzu.

    If filesListBox.SelectedItem Is Nothing Then
        MessageBox.Show("Please select a file.")
        Exit Sub
    End If
    
    ' Obtain the file path from the list box selection.
    Dim filePath = filesListBox.SelectedItem.ToString
    
    ' Verify that the file was not removed since the
    ' Browse button was clicked.
    If My.Computer.FileSystem.FileExists(filePath) = False Then
        MessageBox.Show("File Not Found: " & filePath)
        Exit Sub
    End If
    
    ' Obtain file information in a string.
    Dim fileInfoText As String = GetTextForOutput(filePath)
    
    ' Show the file information.
    MessageBox.Show(fileInfoText)
    

    Der Code stellt sicher, dass ein Element in ListBox ausgewählt ist. Anschließend ruft er den Eintrag des Dateipfads aus ListBox ab. Die <xref:Microsoft.VisualBasic.FileIO.FileSystem.FileExists%2A>-Methode wird verwendet, um zu überprüfen, ob die Datei noch vorhanden ist.

    Der Dateipfad wird als Argument an die GetTextForOutput-Methode gesendet, die im nächsten Schritt hinzugefügt wird. Diese Methode gibt eine Zeichenfolge zurück, die Dateiinformationen enthält. Die Dateiinformationen werden in einer MessageBox angezeigt.

  3. Fügen Sie die folgende GetTextForOutput-Methode hinzu.

    Private Function GetTextForOutput(ByVal filePath As String) As String
        ' Verify that the file exists.
        If My.Computer.FileSystem.FileExists(filePath) = False Then
            Throw New Exception("File Not Found: " & filePath)
        End If
    
        ' Create a new StringBuilder, which is used
        ' to efficiently build strings.
        Dim sb As New System.Text.StringBuilder()
    
        ' Obtain file information.
        Dim thisFile As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo(filePath)
    
        ' Add file attributes.
        sb.Append("File: " & thisFile.FullName)
        sb.Append(vbCrLf)
        sb.Append("Modified: " & thisFile.LastWriteTime.ToString)
        sb.Append(vbCrLf)
        sb.Append("Size: " & thisFile.Length.ToString & " bytes")
        sb.Append(vbCrLf)
    
        ' Open the text file.
        Dim sr As System.IO.StreamReader =
            My.Computer.FileSystem.OpenTextFileReader(filePath)
    
        ' Add the first line from the file.
        If sr.Peek() >= 0 Then
            sb.Append("First Line: " & sr.ReadLine())
        End If
        sr.Close()
    
        Return sb.ToString
    End Function
    

    Der Code verwendet die <xref:Microsoft.VisualBasic.FileIO.FileSystem.GetFileInfo%2A>-Methode zum Abrufen von Dateiparametern. Die Dateiparameter werden einem <xref:System.Text.StringBuilder> hinzugefügt.

    Die <xref:Microsoft.VisualBasic.FileIO.FileSystem.OpenTextFileReader%2A>-Methode liest den Dateiinhalt in ein <xref:System.IO.StreamReader>-Element aus. Die erste Zeile des Inhalts wird von StreamReader abgerufen und zu StringBuilder hinzugefügt.

  4. Führen Sie die Anwendung aus. Klicken Sie auf Durchsuchen, und suchen Sie nach einem Ordner, der .txt-Dateien enthält. Klicken Sie auf OK.

    Wählen Sie eine Datei aus ListBox aus, und klicken Sie anschließend auf Examine (Untersuchen). Die Dateiinformationen werden von MessageBox angezeigt.

  5. Beenden Sie die Ausführung der Anwendung.

So fügen Sie einen Protokolleintrag hinzu

  1. Fügen Sie am Ende des examineButton_Click-Ereignishandlers folgenden Code hinzu.

    If saveCheckBox.Checked = True Then
        ' Place the log file in the same folder as the examined file.
        Dim logFolder As String = My.Computer.FileSystem.GetFileInfo(filePath).DirectoryName
        Dim logFilePath = My.Computer.FileSystem.CombinePath(logFolder, "log.txt")
    
        Dim logText As String = "Logged: " & Date.Now.ToString &
            vbCrLf & fileInfoText & vbCrLf & vbCrLf
    
        ' Append text to the log file.
        My.Computer.FileSystem.WriteAllText(logFilePath, logText, append:=True)
    End If
    

    Der Protokolldateipfad wird vom Code so festgelegt, dass die Protokolldatei in dem Verzeichnis gespeichert wird, das auch das Verzeichnis der ausgewählten Datei ist. Der Text der Protokolldatei wird auf das aktuelle Datum und die Uhrzeit sowie die Dateiinformationen festgelegt.

    Zum Erstellen des Protokolleintrags wird die <xref:Microsoft.VisualBasic.FileIO.FileSystem.WriteAllText%2A>-Methode verwendet, deren append-Argument auf True festgelegt ist.

  2. Führen Sie die Anwendung aus. Navigieren Sie zu einer Textdatei, wählen Sie diese in ListBox aus, aktivieren Sie das Kontrollkästchen Save Results (Ergebnisse speichern), und klicken Sie auf Examine (Untersuchen). Stellen Sie sicher, dass der Protokolleintrag in die log.txt-Datei geschrieben ist.

  3. Beenden Sie die Ausführung der Anwendung.

So verwenden Sie das aktuelle Verzeichnis

  1. Erstellen Sie einen Ereignishandler für Form1_Load, indem Sie auf das Formular doppelklicken.

  2. Fügen Sie dem Ereignishandler folgenden Code hinzu.

    ' Set the default directory of the folder browser to the current directory.
    FolderBrowserDialog1.SelectedPath = My.Computer.FileSystem.CurrentDirectory
    

    Durch diesen Code wird das Standardverzeichnis auf den Browser des Ordners zum aktuellen Verzeichnis festgelegt.

  3. Führen Sie die Anwendung aus. Wenn Sie zum ersten Mal auf Durchsuchen klicken, wird das Dialogfeld Ordner suchen im aktuellen Verzeichnis geöffnet.

  4. Beenden Sie die Ausführung der Anwendung.

So aktivieren Sie Steuerelemente selektiv

  1. Fügen Sie die folgende SetEnabled-Methode hinzu.

    Private Sub SetEnabled()
        Dim anySelected As Boolean =
            (filesListBox.SelectedItem IsNot Nothing)
    
        examineButton.Enabled = anySelected
        saveCheckBox.Enabled = anySelected
    End Sub
    

    Die Methode SetEnabled aktiviert oder deaktiviert Steuerelemente. Dies hängt davon ab, ob ein Element in ListBox ausgewählt ist.

  2. Erstellen Sie einen SelectedIndexChanged-Ereignishandler für filesListBox, indem Sie auf das Steuerelement ListBox im Formular doppelklicken.

  3. Fügen Sie im Ereignishandler filesListBox_SelectedIndexChanged einen Aufruf von SetEnabled hinzu.

  4. Fügen Sie am Ende des Ereignishandlers browseButton_Click einen Aufruf von SetEnabled hinzu.

  5. Fügen Sie am Ende des Ereignishandlers Form1_Load einen Aufruf von SetEnabled hinzu.

  6. Führen Sie die Anwendung aus. Das Kontrollkästchen Save Results (Ergebnisse speichern) und die Schaltfläche Examine (Untersuchen) sind deaktiviert, wenn ein Element nicht in ListBox ausgewählt ist.

Ausführliches Beispiel mit Verwendung von „My.Computer.FileSystem“

Im Folgenden sehen Sie das vollständige Beispiel.


' This example uses members of the My.Computer.FileSystem
' object, which are available in Visual Basic.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' Set the default directory of the folder browser to the current directory.
    FolderBrowserDialog1.SelectedPath = My.Computer.FileSystem.CurrentDirectory

    SetEnabled()
End Sub

Private Sub browseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles browseButton.Click
    If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
        ' List files in the folder.
        ListFiles(FolderBrowserDialog1.SelectedPath)
    End If
    SetEnabled()
End Sub

Private Sub ListFiles(ByVal folderPath As String)
    filesListBox.Items.Clear()

    Dim fileNames = My.Computer.FileSystem.GetFiles(
        folderPath, FileIO.SearchOption.SearchTopLevelOnly, "*.txt")

    For Each fileName As String In fileNames
        filesListBox.Items.Add(fileName)
    Next
End Sub

Private Sub examineButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles examineButton.Click
    If filesListBox.SelectedItem Is Nothing Then
        MessageBox.Show("Please select a file.")
        Exit Sub
    End If

    ' Obtain the file path from the list box selection.
    Dim filePath = filesListBox.SelectedItem.ToString

    ' Verify that the file was not removed since the
    ' Browse button was clicked.
    If My.Computer.FileSystem.FileExists(filePath) = False Then
        MessageBox.Show("File Not Found: " & filePath)
        Exit Sub
    End If

    ' Obtain file information in a string.
    Dim fileInfoText As String = GetTextForOutput(filePath)

    ' Show the file information.
    MessageBox.Show(fileInfoText)

    If saveCheckBox.Checked = True Then
        ' Place the log file in the same folder as the examined file.
        Dim logFolder As String = My.Computer.FileSystem.GetFileInfo(filePath).DirectoryName
        Dim logFilePath = My.Computer.FileSystem.CombinePath(logFolder, "log.txt")

        Dim logText As String = "Logged: " & Date.Now.ToString &
            vbCrLf & fileInfoText & vbCrLf & vbCrLf

        ' Append text to the log file.
        My.Computer.FileSystem.WriteAllText(logFilePath, logText, append:=True)
    End If
End Sub

Private Function GetTextForOutput(ByVal filePath As String) As String
    ' Verify that the file exists.
    If My.Computer.FileSystem.FileExists(filePath) = False Then
        Throw New Exception("File Not Found: " & filePath)
    End If

    ' Create a new StringBuilder, which is used
    ' to efficiently build strings.
    Dim sb As New System.Text.StringBuilder()

    ' Obtain file information.
    Dim thisFile As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo(filePath)

    ' Add file attributes.
    sb.Append("File: " & thisFile.FullName)
    sb.Append(vbCrLf)
    sb.Append("Modified: " & thisFile.LastWriteTime.ToString)
    sb.Append(vbCrLf)
    sb.Append("Size: " & thisFile.Length.ToString & " bytes")
    sb.Append(vbCrLf)

    ' Open the text file.
    Dim sr As System.IO.StreamReader =
        My.Computer.FileSystem.OpenTextFileReader(filePath)

    ' Add the first line from the file.
    If sr.Peek() >= 0 Then
        sb.Append("First Line: " & sr.ReadLine())
    End If
    sr.Close()

    Return sb.ToString
End Function

Private Sub filesListBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles filesListBox.SelectedIndexChanged
    SetEnabled()
End Sub

Private Sub SetEnabled()
    Dim anySelected As Boolean =
        (filesListBox.SelectedItem IsNot Nothing)

    examineButton.Enabled = anySelected
    saveCheckBox.Enabled = anySelected
End Sub

Ausführliches Beispiel mit Verwendung von „System.IO“

Im folgenden entsprechenden Beispiel werden Klassen aus dem Namespace <xref:System.IO> anstelle von My.Computer.FileSystem-Objekten verwendet.


' This example uses classes from the System.IO namespace.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' Set the default directory of the folder browser to the current directory.
    FolderBrowserDialog1.SelectedPath =
        System.IO.Directory.GetCurrentDirectory()

    SetEnabled()
End Sub

Private Sub browseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles browseButton.Click
    If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
        ' List files in the folder.
        ListFiles(FolderBrowserDialog1.SelectedPath)
        SetEnabled()
    End If
End Sub

Private Sub ListFiles(ByVal folderPath As String)
    filesListBox.Items.Clear()

    Dim fileNames As String() =
        System.IO.Directory.GetFiles(folderPath,
            "*.txt", System.IO.SearchOption.TopDirectoryOnly)

    For Each fileName As String In fileNames
        filesListBox.Items.Add(fileName)
    Next
End Sub

Private Sub examineButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles examineButton.Click
    If filesListBox.SelectedItem Is Nothing Then
        MessageBox.Show("Please select a file.")
        Exit Sub
    End If

    ' Obtain the file path from the list box selection.
    Dim filePath = filesListBox.SelectedItem.ToString

    ' Verify that the file was not removed since the
    ' Browse button was clicked.
    If System.IO.File.Exists(filePath) = False Then
        MessageBox.Show("File Not Found: " & filePath)
        Exit Sub
    End If

    ' Obtain file information in a string.
    Dim fileInfoText As String = GetTextForOutput(filePath)

    ' Show the file information.
    MessageBox.Show(fileInfoText)

    If saveCheckBox.Checked = True Then
        ' Place the log file in the same folder as the examined file.
        Dim logFolder As String =
            System.IO.Path.GetDirectoryName(filePath)
        Dim logFilePath = System.IO.Path.Combine(logFolder, "log.txt")

        ' Append text to the log file.
        Dim logText As String = "Logged: " & Date.Now.ToString &
            vbCrLf & fileInfoText & vbCrLf & vbCrLf

        System.IO.File.AppendAllText(logFilePath, logText)
    End If
End Sub

Private Function GetTextForOutput(ByVal filePath As String) As String
    ' Verify that the file exists.
    If System.IO.File.Exists(filePath) = False Then
        Throw New Exception("File Not Found: " & filePath)
    End If

    ' Create a new StringBuilder, which is used
    ' to efficiently build strings.
    Dim sb As New System.Text.StringBuilder()

    ' Obtain file information.
    Dim thisFile As New System.IO.FileInfo(filePath)

    ' Add file attributes.
    sb.Append("File: " & thisFile.FullName)
    sb.Append(vbCrLf)
    sb.Append("Modified: " & thisFile.LastWriteTime.ToString)
    sb.Append(vbCrLf)
    sb.Append("Size: " & thisFile.Length.ToString & " bytes")
    sb.Append(vbCrLf)

    ' Open the text file.
    Dim sr As System.IO.StreamReader =
        System.IO.File.OpenText(filePath)

    ' Add the first line from the file.
    If sr.Peek() >= 0 Then
        sb.Append("First Line: " & sr.ReadLine())
    End If
    sr.Close()

    Return sb.ToString
End Function

Private Sub filesListBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles filesListBox.SelectedIndexChanged
    SetEnabled()
End Sub

Private Sub SetEnabled()
    Dim anySelected As Boolean =
        (filesListBox.SelectedItem IsNot Nothing)

    examineButton.Enabled = anySelected
    saveCheckBox.Enabled = anySelected
End Sub

Siehe auch

<xref:System.IO>
<xref:Microsoft.VisualBasic.FileIO.FileSystem>
<xref:Microsoft.VisualBasic.FileIO.FileSystem.CurrentDirectory%2A>
Exemplarische Vorgehensweise: Bearbeiten von Dateien mit .NET Framework-Methoden