Поделиться через


Пошаговое руководство. Управление файлами и каталогами в Visual Basic

В этом пошаговом руководстве приведены общие сведения о принципах ввода-вывода файлов в Visual Basic. В нем описывается создание небольшого приложения, которое перечисляет и проверяет текстовые файлы в каталоге. Для каждого выбранного текстового файла приложение предоставляет атрибуты файла и первую строку содержимого. Существует возможность записи сведений в файл журнала.

В этом пошаговом руководстве используются элементы My.Computer.FileSystem Object, которые доступны в Visual Basic. См. FileSystem для получения дополнительной информации. В конце пошагового руководства приведен эквивалентный пример, использующий классы из System.IO пространства имен.

Замечание

На компьютере могут отображаться различные имена или расположения для некоторых элементов пользовательского интерфейса Visual Studio в следующих инструкциях. Выпуск Visual Studio, который у вас есть, и параметры, которые вы используете, определяют эти элементы. Дополнительные сведения см. в разделе Персонализация интегрированной среды разработки.

Создание проекта

  1. На меню Файл щелкните Новый проект.

    Откроется диалоговое окно Создание проекта .

  2. В области установленных шаблонов разверните Visual Basic и щелкните Windows. В области "Шаблоны " в середине щелкните "Приложение Windows Forms".

  3. В поле "Имя" введите FileExplorer имя проекта и нажмите кнопку "ОК".

    Visual Studio добавляет проект в обозреватель решений, и откроется конструктор Windows Forms.

  4. Добавьте элементы управления в следующую таблицу в форму и задайте соответствующие значения для их свойств.

    Контроль Недвижимость Ценность
    ListBox Имя filesListBox
    Кнопка Имя

    Текст
    browseButton

    Просмотр
    Кнопка Имя

    Текст
    examineButton

    Изучать
    Флажок Имя

    Текст
    saveCheckBox

    Сохранение результатов
    FolderBrowserDialog Имя FolderBrowserDialog1

Выбор папки и перечисление файлов в папке

  1. Дважды щелкнув элемент управления на форме, создайте обработчик событий ClickbrowseButton. Откроется редактор кода.

  2. Добавьте следующий код в обработчик событий Click.

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

    Вызов открывает диалоговое FolderBrowserDialog1.ShowDialog окно "Обзор папки ". После нажатия кнопки ОКSelectedPath свойство отправляется в качестве аргумента ListFiles методу, который добавляется на следующем шаге.

  3. Добавьте следующий ListFiles метод.

    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
    

    Этот код сначала очищает ListBox.

    Затем GetFiles метод извлекает коллекцию строк, по одному для каждого файла в каталоге. Метод GetFiles принимает аргумент шаблона поиска для получения файлов, соответствующих определенному шаблону. В этом примере возвращаются только файлы с расширением .txt.

    Затем строки, возвращаемые методом GetFiles , добавляются в ListBox.

  4. Запустите приложение. Нажмите кнопку Обзор. В диалоговом окне "Обзор папки" перейдите к папке, содержащей .txt файлы, а затем выберите папку и нажмите кнопку "ОК".

    Элемент ListBox содержит список файлов .txt в выбранной папке.

  5. Остановите запуск приложения.

Получение атрибутов файла и содержимого из текстового файла

  1. Дважды щелкнув элемент управления на форме, создайте обработчик событий ClickexamineButton.

  2. Добавьте следующий код в обработчик событий 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)
    

    Код проверяет, выбран ли элемент в компоненте ListBox. Затем он получает запись пути к файлу из ListBox. Метод FileExists используется для проверки того, существует ли файл.

    Путь к файлу отправляется в качестве аргумента GetTextForOutput методу, который добавляется на следующем шаге. Этот метод возвращает строку, содержащую сведения о файле. Сведения о файле отображаются в MessageBox.

  3. Добавьте следующий GetTextForOutput метод.

    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
    

    Код использует GetFileInfo метод для получения параметров файла. Параметры файла добавляются в StringBuilder.

    Метод OpenTextFileReader считывает содержимое файла в объект StreamReader. Первая строка содержимого извлекается из StreamReader и добавляется в StringBuilder.

  4. Запустите приложение. Нажмите кнопку "Обзор" и перейдите к папке, содержащей .txt файлы. Нажмите кнопку ОК.

    Выберите файл в списке ListBox, а затем нажмите кнопку "Проверить". Отображается MessageBox информация о файле.

  5. Остановите запуск приложения.

Добавление записи журнала

  1. Добавьте следующий код в конец обработчика examineButton_Click событий.

    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
    

    Код задает путь к файлу журнала, чтобы поместить файл журнала в тот же каталог, что и выбранный файл. Текст записи в журнале содержит текущие дату и время, а затем информацию о файле.

    Метод WriteAllText с заданным аргументом appendTrueиспользуется для создания записи журнала.

  2. Запустите приложение. Перейдите к текстовому файлу, выберите его в ListBoxполе , установите флажок "Сохранить результаты " и нажмите кнопку "Проверить". Убедитесь, что запись журнала записывается в log.txt файл.

  3. Остановите запуск приложения.

Использование текущего каталога

  1. Дважды щелкнув форму, создайте обработчик событий для Form1_Load.

  2. Добавьте следующий код в обработчик событий.

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

    Этот код задает каталог по умолчанию браузера папок для текущего каталога.

  3. Запустите приложение. При первом нажатии кнопки "Обзор папки" откроется диалоговое окно "Обзор папки " в текущем каталоге.

  4. Остановите запуск приложения.

Выборочное включение элементов управления

  1. Добавьте следующий SetEnabled метод.

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

    Метод SetEnabled включает или отключает элементы управления в зависимости от того, выбран ли элемент в элементе ListBox.

  2. Создайте обработчик событий SelectedIndexChanged, дважды щелкнув элемент управления filesListBox на форме ListBox.

  3. Добавьте вызов SetEnabled в новый filesListBox_SelectedIndexChanged обработчик событий.

  4. Добавьте вызов SetEnabled в конец обработчика browseButton_Click событий.

  5. Добавьте вызов SetEnabled в конец обработчика Form1_Load событий.

  6. Запустите приложение. Флажок "Сохранить результаты " и кнопка "Проверить " отключена, если элемент не выбран в элементе ListBox.

Полный пример использования My.Computer.FileSystem

Ниже приведен полный пример.


' 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

Полный пример использования System.IO

В следующем эквивалентном примере используются классы из System.IO пространства имен вместо использования 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

См. также