Dela via


Genomgång: Manipulera filer och kataloger i Visual Basic

Den här genomgången ger en introduktion till grunderna för fil-I/O i Visual Basic. Den beskriver hur du skapar ett litet program som visar och undersöker textfiler i en katalog. För varje markerad textfil innehåller programmet filattribut och den första innehållsraden. Det finns ett alternativ för att skriva information till en loggfil.

Den här genomgången använder medlemmar i My.Computer.FileSystem Object, som är tillgängliga i Visual Basic. Mer information finns i FileSystem. I slutet av genomgången tillhandahålls ett motsvarande exempel som använder klasser från System.IO namnområdet.

Kommentar

Datorn kan visa olika namn eller platser för vissa av Visual Studio-användargränssnittselementen i följande instruktioner. Den Visual Studio-utgåva som du har och de inställningar som du använder avgör dessa element. Mer information finns i Anpassa IDE.

Så här skapar du projektet

  1. På Arkiv-menyn klickar du på Nytt projekt.

    Dialogrutan Nytt projekt visas.

  2. I fönstret Installerade mallar expanderar du Visual Basic och klickar sedan på Windows. I fönstret Mallar i mitten klickar du på Windows Forms-program.

  3. I rutan Namn skriver du FileExplorer för att ange projektnamnet och klickar sedan på OK.

    Visual Studio lägger till projektet i Solution Explorer och Windows Forms Designer öppnas.

  4. Lägg till kontrollerna i följande tabell i formuläret och ange motsvarande värden för deras egenskaper.

    Kontroll Property Värde
    Listruta Namn filesListBox
    Knapp Namn

    Text
    browseButton

    Bläddra
    Knapp Namn

    Text
    examineButton

    Undersöka
    Kryssrutan Namn

    Text
    saveCheckBox

    Spara resultat
    Folderbrowserdialog Namn FolderBrowserDialog1

Så här väljer du en mapp och listar filer i en mapp

  1. Skapa en Click händelsehanterare för browseButton genom att dubbelklicka på kontrollen i formuläret. Kodredigeraren öppnas.

  2. Lägg till följande kod i Click händelsehanteraren.

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

    Anropet FolderBrowserDialog1.ShowDialogöppnar dialogrutan Bläddra efter mapp . När användaren klickar på OK SelectedPathskickas egenskapen som ett argument till metoden, som läggs till ListFiles i nästa steg.

  3. Lägg till följande 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
    

    Den här koden rensar först ListBox.

    Metoden GetFiles hämtar sedan en samling strängar, en för varje fil i katalogen. Metoden GetFiles accepterar ett sökmönsterargument för att hämta filer som matchar ett visst mönster. I det här exemplet returneras endast filer som har tillägget .txt.

    Strängarna som returneras av GetFiles metoden läggs sedan till i ListBox.

  4. Kör programmet. Klicka på knappen Bläddra . I dialogrutan Bläddra efter mapp bläddrar du till en mapp som innehåller .txt filer och väljer sedan mappen och klickar på OK.

    Innehåller ListBox en lista över .txt filer i den valda mappen.

  5. Sluta köra programmet.

Hämta attribut för en fil och innehåll från en textfil

  1. Skapa en Click händelsehanterare för examineButton genom att dubbelklicka på kontrollen i formuläret.

  2. Lägg till följande kod i Click händelsehanteraren.

    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)
    

    Koden verifierar att ett objekt är markerat i ListBox. Den hämtar sedan filsökvägsposten från ListBox. Metoden FileExists används för att kontrollera om filen fortfarande finns.

    Filsökvägen skickas som ett argument till metoden, som läggs till GetTextForOutput i nästa steg. Den här metoden returnerar en sträng som innehåller filinformation. Filinformationen visas i en MessageBox.

  3. Lägg till följande 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
    

    Koden använder GetFileInfo metoden för att hämta filparametrar. Filparametrarna läggs till i en StringBuilder.

    Metoden OpenTextFileReader läser in filinnehållet i en StreamReader. Den första innehållsraden hämtas från StreamReader och läggs till i StringBuilder.

  4. Kör programmet. Klicka på Bläddra och bläddra till en mapp som innehåller .txt filer. Klicka på OK.

    Välj en fil i ListBoxoch klicka sedan på Undersök. A MessageBox visar filinformationen.

  5. Sluta köra programmet.

Så här lägger du till en loggpost

  1. Lägg till följande kod i slutet av examineButton_Click händelsehanteraren.

    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
    

    Koden anger loggfilsökvägen för att placera loggfilen i samma katalog som den valda filens. Texten i loggposten anges till aktuellt datum och tid följt av filinformationen.

    Metoden WriteAllText , med append argumentet inställt på True, används för att skapa loggposten.

  2. Kör programmet. Bläddra till en textfil, markera den i kryssrutan ListBox, markera kryssrutan Spara resultat och klicka sedan på Undersök. Kontrollera att loggposten har skrivits log.txt till filen.

  3. Sluta köra programmet.

Så här använder du den aktuella katalogen

  1. Skapa en händelsehanterare för Form1_Load genom att dubbelklicka på formuläret.

  2. Lägg till följande kod i händelsehanteraren.

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

    Den här koden anger standardkatalogen för mappwebbläsaren till den aktuella katalogen.

  3. Kör programmet. När du klickar på Bläddra första gången öppnas dialogrutan Bläddra efter mapp till den aktuella katalogen.

  4. Sluta köra programmet.

Så här aktiverar du kontroller selektivt

  1. Lägg till följande SetEnabled metod.

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

    Metoden SetEnabled aktiverar eller inaktiverar kontroller beroende på om ett objekt har valts i ListBox.

  2. Skapa en SelectedIndexChanged händelsehanterare för filesListBox genom att ListBox dubbelklicka på kontrollen i formuläret.

  3. Lägg till ett anrop till SetEnabled i den nya filesListBox_SelectedIndexChanged händelsehanteraren.

  4. Lägg till ett anrop till SetEnabled i slutet av browseButton_Click händelsehanteraren.

  5. Lägg till ett anrop till SetEnabled i slutet av Form1_Load händelsehanteraren.

  6. Kör programmet. Kryssrutan Spara resultat och knappen Undersök inaktiveras om ett objekt inte är markerat i ListBox.

Fullständigt exempel med My.Computer.FileSystem

Följande är det fullständiga exemplet.


' 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

Fullständigt exempel med System.IO

I följande motsvarande exempel används klasser från System.IO namnområdet i stället för att använda 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

Se även