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
W menu Plik kliknij pozycję Nowy projekt.
Zostanie wyświetlone okno dialogowe Nowy projekt.
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.
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.
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
TekstbrowseButton
PrzeglądajPrzycisk Nazwa/nazwisko
TekstexamineButton
ZbadaćCheckBox Nazwa/nazwisko
TekstsaveCheckBox
Zapisz wynikiFolderbrowserdialog Nazwa/nazwisko FolderBrowserDialog1
Aby wybrać folder i wyświetlić listę plików w folderze
Utwórz procedurę obsługi zdarzeń
Click
,browseButton
klikając dwukrotnie kontrolkę w formularzu. Zostanie otwarty Edytor kodu.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 doListFiles
metody, która zostanie dodana w następnym kroku.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.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.Zatrzymaj uruchamianie aplikacji.
Aby uzyskać atrybuty pliku i zawartość z pliku tekstowego
Utwórz procedurę obsługi zdarzeń
Click
,examineButton
klikając dwukrotnie kontrolkę w formularzu.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 plikuListBox
. 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.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 elementuStringBuilder
.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 zawieraMessageBox
informacje o pliku.Zatrzymaj uruchamianie aplikacji.
Aby dodać wpis dziennika
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
naTrue
, służy do tworzenia wpisu dziennika.Uruchom aplikację. Przejdź do pliku tekstowego, zaznacz go w
ListBox
polu , zaznacz pole wyboru Zapisz wyniki , a następnie kliknij przycisk Zbadaj. Sprawdź, czy wpis dziennika jest zapisywany wlog.txt
pliku.Zatrzymaj uruchamianie aplikacji.
Aby użyć bieżącego katalogu
Utwórz program obsługi zdarzeń dla
Form1_Load
programu , klikając dwukrotnie formularz.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.
Uruchom aplikację. Po kliknięciu przycisku Przeglądaj po raz pierwszy zostanie otwarte okno dialogowe Przeglądaj dla folderu w bieżącym katalogu.
Zatrzymaj uruchamianie aplikacji.
Aby selektywnie włączyć kontrolki
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 elemencieListBox
.Utwórz procedurę obsługi zdarzeń
SelectedIndexChanged
,filesListBox
klikając dwukrotnie kontrolkęListBox
w formularzu.Dodaj wywołanie metody w
SetEnabled
nowejfilesListBox_SelectedIndexChanged
procedurze obsługi zdarzeń.Dodaj wywołanie na
SetEnabled
końcu programu obsługi zdarzeńbrowseButton_Click
.Dodaj wywołanie na
SetEnabled
końcu programu obsługi zdarzeńForm1_Load
.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