Návod: Práce se soubory a adresáři v jazyce Visual Basic

Tento návod obsahuje úvod k základům vstupně-výstupních operací souborů v jazyce Visual Basic. Popisuje, jak vytvořit malou aplikaci, která vypíše a prozkoumá textové soubory v adresáři. Pro každý vybraný textový soubor aplikace poskytuje atributy souboru a první řádek obsahu. K dispozici je možnost zápisu informací do souboru protokolu.

Tento návod používá členy My.Computer.FileSystem Object, které jsou k dispozici v jazyce Visual Basic. Další informace naleznete v tématu FileSystem. Na konci návodu je k dispozici ekvivalentní příklad, který používá třídy z System.IO oboru názvů.

Poznámka:

Váš počítač může v následujících pokynech zobrazovat odlišné názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Tyto prvky jsou určeny edicí sady Visual Studio a použitým nastavením. Další informace najdete v tématu Přizpůsobení integrovaného vývojového prostředí.

Vytvoření projektu

  1. V nabídce Soubor klepněte na tlačítko Nový projekt.

    Zobrazí se dialogové okno Nový projekt.

  2. V podokně Nainstalované šablony rozbalte položku Visual Basic a klepněte na tlačítko Windows. V podokně Šablony uprostřed klikněte na model Windows Forms Aplikace.

  3. Do pole Název zadejte FileExplorer název projektu a klepněte na tlačítko OK.

    Visual Studio přidá projekt do Průzkumník řešení a otevře se návrhář model Windows Forms.

  4. Přidejte ovládací prvky v následující tabulce do formuláře a nastavte odpovídající hodnoty pro jejich vlastnosti.

    Control Vlastnost Hodnota
    ListBox Název filesListBox
    Tlačítko Název

    Text
    browseButton

    Procházet
    Tlačítko Název

    Text
    examineButton

    Zkoumat
    CheckBox Název

    Text
    saveCheckBox

    Uložit výsledky
    FolderBrowserDialog Název FolderBrowserDialog1

Výběr složky a výpis souborů ve složce

  1. Vytvořte obslužnou rutinu Click události tak browseButton , že dvakrát kliknete na ovládací prvek ve formuláři. Otevře se Editor kódu.

  2. Do obslužné rutiny Click události přidejte následující kód.

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

    Hovor FolderBrowserDialog1.ShowDialog otevře dialogové okno Procházet složku . Jakmile uživatel klikne na OK, SelectedPath vlastnost se odešle jako argument metodě ListFiles , která je přidána v dalším kroku.

  3. Přidejte následující ListFiles metodu.

    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
    

    Tento kód nejprve vymaže ListBox.

    Metoda GetFiles pak načte kolekci řetězců, jednu pro každý soubor v adresáři. Metoda GetFiles přijímá argument vzoru vyhledávání pro načtení souborů, které odpovídají určitému vzoru. V tomto příkladu se vrátí pouze soubory, které mají příponu .txt.

    Řetězce vrácené metodou GetFiles se pak přidají do ListBoxu.

  4. Aplikaci spusťte. Klikněte na tlačítko Procházet . V dialogovém okně Procházet složku přejděte do složky, která obsahuje .txt soubory, a vyberte složku a klikněte na tlačítko OK.

    Obsahuje ListBox seznam .txt souborů ve vybrané složce.

  5. Ukončete spuštění aplikace.

Získání atributů souboru a obsahu z textového souboru

  1. Vytvořte obslužnou rutinu Click události tak examineButton , že dvakrát kliknete na ovládací prvek ve formuláři.

  2. Do obslužné rutiny Click události přidejte následující kód.

    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)
    

    Kód ověří, zda je položka vybrána v souboru ListBox. Potom získá položku cesty k souboru z objektu ListBox. Metoda FileExists slouží ke kontrole, zda soubor stále existuje.

    Cesta k souboru se odešle jako argument metodě GetTextForOutput , která je přidána v dalším kroku. Tato metoda vrátí řetězec, který obsahuje informace o souboru. Informace o souboru se zobrazí ve složce MessageBox.

  3. Přidejte následující GetTextForOutput metodu.

    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
    

    Kód používá metodu GetFileInfo k získání parametrů souboru. Parametry souboru se přidají do souboru StringBuilder.

    Metoda OpenTextFileReader načte obsah souboru do souboru StreamReader. První řádek obsahu je získán z StreamReader a je přidán do StringBuilder.

  4. Aplikaci spusťte. Klikněte na Procházet a přejděte do složky, která obsahuje .txt soubory. Klikněte na OK.

    Vyberte soubor v nástroji ListBoxa klepněte na tlačítko Prozkoumat. Zobrazí MessageBox informace o souboru.

  5. Ukončete spuštění aplikace.

Přidání položky protokolu

  1. Na konec examineButton_Click obslužné rutiny události přidejte následující kód.

    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
    

    Kód nastaví cestu k souboru protokolu tak, aby se soubor protokolu umístil do stejného adresáře jako u vybraného souboru. Text položky protokolu je nastavený na aktuální datum a čas následovaný informacemi o souboru.

    Metoda WriteAllText s argumentem nastaveným append na True, se používá k vytvoření položky protokolu.

  2. Aplikaci spusťte. Přejděte k textovému souboru, vyberte ho v ListBoxseznamu , zaškrtněte políčko Uložit výsledky a klikněte na tlačítko Prozkoumat. Ověřte, že je položka protokolu zapsána log.txt do souboru.

  3. Ukončete spuštění aplikace.

Použití aktuálního adresáře

  1. Poklikáním na formulář vytvořte obslužnou rutinu Form1_Load události.

  2. Do obslužné rutiny události přidejte následující kód.

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

    Tento kód nastaví výchozí adresář prohlížeče složek na aktuální adresář.

  3. Aplikaci spusťte. Když poprvé kliknete na Procházet , otevře se dialogové okno Procházet složku v aktuálním adresáři.

  4. Ukončete spuštění aplikace.

Selektivní povolení ovládacích prvků

  1. Přidejte následující SetEnabled metodu.

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

    Metoda SetEnabled povolí nebo zakáže ovládací prvky v závislosti na tom, zda je položka vybrána v souboru ListBox.

  2. Vytvořte obslužnou rutinu SelectedIndexChanged události tak filesListBox , že dvakrát kliknete na ListBox ovládací prvek ve formuláři.

  3. Přidejte volání do SetEnabled nové filesListBox_SelectedIndexChanged obslužné rutiny události.

  4. Na konec obslužné rutiny browseButton_Click události přidejte voláníSetEnabled.

  5. Na konec obslužné rutiny Form1_Load události přidejte voláníSetEnabled.

  6. Aplikaci spusťte. Zaškrtávací políčko Uložit výsledky a tlačítko Prozkoumat jsou zakázány, pokud položka není vybrána v okně ListBox.

Úplný příklad s použitím my.Computer.FileSystem

Následuje úplný příklad.


' 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

Úplný příklad použití System.IO

Následující ekvivalentní příklad používá třídy z System.IO oboru názvů místo použití My.Computer.FileSystem objektů.


' 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

Viz také