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

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

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

Примечание

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

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

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

    Откроется диалоговое окно Новый проект.

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

  3. В поле Имя введите FileExplorer, чтобы задать имя проекта, и затем нажмите кнопку ОК.

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

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

    Control

    Свойство

    Значение

    ListBox

    Name

    filesListBox

    Кнопка

    Name

    Text

    browseButton

    Обзор

    Кнопка

    Name

    Text

    examineButton

    Исследовать

    CheckBox

    Name

    Text

    saveCheckBox

    Сохранить результаты

    FolderBrowserDialog

    Name

    FolderBrowserDialog1

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

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

  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. Создайте обработчик событий нажатия Click для кнопки examineButton, дважды щелкнув этот элемент управления в форме.

  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 с аргументом append со значением True используется для создания записи журнала.

  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

См. также

Задачи

Пошаговое руководство. Управление файлами с помощью методов .NET Framework (Visual Basic)

Ссылки

System.IO

FileSystem

CurrentDirectory

Журнал изменений

Дата

Журнал

Причина

Декабрь 2010

Проверенные примеры и пошаговое руководство.

Доработка

Август 2010

Обновленный и исправленный пример кода.

Обратная связь от клиента.