Wskazówki: manipulowanie plikami i katalogami w Visual Basic

Ten przewodnik zawiera wprowadzenie do podstaw operacji we/wy plików w Visual Basic. W tym artykule opisano sposób tworzenia małej aplikacji, która wyświetla listę i analizuje pliki tekstowe w katalogu. Dla każdego zaznaczonego pliku tekstowego aplikacja udostępnia atrybuty pliku i pierwszy wiersz zawartości. Istnieje możliwość zapisania informacji w pliku dziennika.

W tym przewodniku są używane elementy członkowskie elementu My.Computer.FileSystem Object, które są dostępne w języku Visual Basic. Aby uzyskać więcej informacji, zobacz FileSystem. Na końcu przewodnika podano równoważny przykład, który używa klas z System.IO przestrzeni nazw.

Uwaga

Na komputerze w poniższych instrukcjach mogą być wyświetlane inne nazwy i lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio. Te elementy są określane przez numer wersji Visual Studio oraz twoje ustawienia. Aby uzyskać więcej informacji, zobacz Personalizowanie środowiska IDE.

Aby utworzyć projekt

  1. W menu Plik kliknij pozycję Nowy projekt.

    Zostanie wyświetlone okno dialogowe Nowy projekt.

  2. W okienku Zainstalowane szablony rozwiń węzeł Visual Basic, a następnie kliknij pozycję Windows. W okienku Szablony w środku kliknij pozycję Aplikacja formularzy systemu Windows.

  3. W polu Nazwa wpisz FileExplorer , aby ustawić nazwę projektu, a następnie kliknij przycisk OK.

    Program Visual Studio dodaje projekt do Eksplorator rozwiązań, a zostanie otwarty Projektant Windows Forms.

  4. Dodaj kontrolki w poniższej tabeli do formularza i ustaw odpowiednie wartości dla ich właściwości.

    Kontrolka Właściwości Wartość
    ListBox Nazwa/nazwisko filesListBox
    Przycisk Nazwa/nazwisko

    Tekst
    browseButton

    Przeglądaj
    Przycisk Nazwa/nazwisko

    Tekst
    examineButton

    Zbadać
    CheckBox Nazwa/nazwisko

    Tekst
    saveCheckBox

    Zapisz wyniki
    Folderbrowserdialog Nazwa/nazwisko FolderBrowserDialog1

Aby wybrać folder i wyświetlić listę plików w folderze

  1. Utwórz procedurę obsługi zdarzeń Click , browseButton klikając dwukrotnie kontrolkę w formularzu. Zostanie otwarty Edytor kodu.

  2. Dodaj następujący kod do programu obsługi zdarzeń Click .

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

    Wywołanie FolderBrowserDialog1.ShowDialog otwiera okno dialogowe Przeglądaj dla folderu . Gdy użytkownik kliknie przycisk OK, SelectedPath właściwość zostanie wysłana jako argument do ListFiles metody, która zostanie dodana w następnym kroku.

  3. Dodaj następującą ListFiles metodę.

    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
    

    Ten kod najpierw czyści pole ListBox.

    Następnie GetFiles metoda pobiera kolekcję ciągów , po jednym dla każdego pliku w katalogu. Metoda GetFiles akceptuje argument wzorca wyszukiwania w celu pobrania plików pasujących do określonego wzorca. W tym przykładzie zwracane są tylko pliki, które mają .txt rozszerzenia.

    Ciągi zwracane przez metodę GetFiles są następnie dodawane do kontrolki ListBox.

  4. Uruchom aplikację. Kliknij przycisk Przeglądaj. W oknie dialogowym Przeglądaj w poszukiwaniu folderu przejdź do folderu zawierającego pliki .txt, a następnie wybierz folder i kliknij przycisk OK.

    Obiekt ListBox zawiera listę plików .txt w wybranym folderze.

  5. Zatrzymaj uruchamianie aplikacji.

Aby uzyskać atrybuty pliku i zawartość z pliku tekstowego

  1. Utwórz procedurę obsługi zdarzeń Click , examineButton klikając dwukrotnie kontrolkę w formularzu.

  2. Dodaj następujący kod do programu obsługi zdarzeń 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)
    

    Kod sprawdza, czy element został wybrany w elemencie ListBox. Następnie uzyskuje wpis ścieżki pliku z pliku ListBox. Metoda FileExists służy do sprawdzania, czy plik nadal istnieje.

    Ścieżka pliku jest wysyłana jako argument do GetTextForOutput metody, która zostanie dodana w następnym kroku. Ta metoda zwraca ciąg zawierający informacje o pliku. Informacje o pliku są wyświetlane w usłudze MessageBox.

  3. Dodaj następującą GetTextForOutput metodę.

    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
    

    Kod używa metody do uzyskiwania GetFileInfo parametrów pliku. Parametry pliku są dodawane do elementu StringBuilder.

    Metoda OpenTextFileReader odczytuje zawartość pliku do elementu StreamReader. Pierwszy wiersz zawartości jest uzyskiwany z StreamReader elementu i jest dodawany do elementu StringBuilder.

  4. Uruchom aplikację. Kliknij przycisk Przeglądaj i przejdź do folderu zawierającego pliki .txt. Kliknij przycisk OK.

    Wybierz plik w pliku ListBox, a następnie kliknij przycisk Zbadaj. Element zawiera MessageBox informacje o pliku.

  5. Zatrzymaj uruchamianie aplikacji.

Aby dodać wpis dziennika

  1. Dodaj następujący kod na końcu examineButton_Click procedury obsługi zdarzeń.

    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
    

    Kod ustawia ścieżkę pliku dziennika, aby umieścić plik dziennika w tym samym katalogu co wybrany plik. Tekst wpisu dziennika jest ustawiony na bieżącą datę i godzinę, a następnie informacje o pliku.

    Metoda WriteAllText z argumentem ustawionym append na True, służy do tworzenia wpisu dziennika.

  2. Uruchom aplikację. Przejdź do pliku tekstowego, zaznacz go w ListBoxpolu , zaznacz pole wyboru Zapisz wyniki , a następnie kliknij przycisk Zbadaj. Sprawdź, czy wpis dziennika jest zapisywany w log.txt pliku.

  3. Zatrzymaj uruchamianie aplikacji.

Aby użyć bieżącego katalogu

  1. Utwórz program obsługi zdarzeń dla Form1_Load programu , klikając dwukrotnie formularz.

  2. Dodaj następujący kod do programu obsługi zdarzeń.

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

    Ten kod ustawia domyślny katalog przeglądarki folderów na bieżący katalog.

  3. Uruchom aplikację. Po kliknięciu przycisku Przeglądaj po raz pierwszy zostanie otwarte okno dialogowe Przeglądaj dla folderu w bieżącym katalogu.

  4. Zatrzymaj uruchamianie aplikacji.

Aby selektywnie włączyć kontrolki

  1. Dodaj następującą SetEnabled metodę.

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

    Metoda SetEnabled włącza lub wyłącza kontrolki w zależności od tego, czy element jest wybrany w elemencie ListBox.

  2. Utwórz procedurę obsługi zdarzeń SelectedIndexChanged , filesListBox klikając dwukrotnie kontrolkę ListBox w formularzu.

  3. Dodaj wywołanie metody w SetEnabled nowej filesListBox_SelectedIndexChanged procedurze obsługi zdarzeń.

  4. Dodaj wywołanie na SetEnabled końcu programu obsługi zdarzeń browseButton_Click .

  5. Dodaj wywołanie na SetEnabled końcu programu obsługi zdarzeń Form1_Load .

  6. Uruchom aplikację. Pole wyboru Zapisz wyniki i przycisk Sprawdź są wyłączone, jeśli element nie jest zaznaczony w elemencie ListBox.

Pełny przykład użycia systemu My.Computer.FileSystem

Poniżej przedstawiono kompletny przykład.


' 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

Pełny przykład użycia System.IO

W poniższym równoważnym przykładzie System.IO użyto klas z przestrzeni nazw zamiast obiektów My.Computer.FileSystem .


' 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

Zobacz też