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
På Arkiv-menyn klickar du på Nytt projekt.
Dialogrutan Nytt projekt visas.
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.
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.
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
TextbrowseButton
BläddraKnapp Namn
TextexamineButton
UndersökaKryssrutan Namn
TextsaveCheckBox
Spara resultatFolderbrowserdialog Namn FolderBrowserDialog1
Så här väljer du en mapp och listar filer i en mapp
Skapa en
Click
händelsehanterare förbrowseButton
genom att dubbelklicka på kontrollen i formuläret. Kodredigeraren öppnas.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 tillListFiles
i nästa steg.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.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.Sluta köra programmet.
Hämta attribut för en fil och innehåll från en textfil
Skapa en
Click
händelsehanterare förexamineButton
genom att dubbelklicka på kontrollen i formuläret.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ånListBox
. 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.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 iStringBuilder
.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
ListBox
och klicka sedan på Undersök. AMessageBox
visar filinformationen.Sluta köra programmet.
Så här lägger du till en loggpost
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.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 skrivitslog.txt
till filen.Sluta köra programmet.
Så här använder du den aktuella katalogen
Skapa en händelsehanterare för
Form1_Load
genom att dubbelklicka på formuläret.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.
Kör programmet. När du klickar på Bläddra första gången öppnas dialogrutan Bläddra efter mapp till den aktuella katalogen.
Sluta köra programmet.
Så här aktiverar du kontroller selektivt
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 iListBox
.Skapa en
SelectedIndexChanged
händelsehanterare förfilesListBox
genom attListBox
dubbelklicka på kontrollen i formuläret.Lägg till ett anrop till
SetEnabled
i den nyafilesListBox_SelectedIndexChanged
händelsehanteraren.Lägg till ett anrop till
SetEnabled
i slutet avbrowseButton_Click
händelsehanteraren.Lägg till ett anrop till
SetEnabled
i slutet avForm1_Load
händelsehanteraren.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