연습: Visual Basic에서 파일과 디렉터리 조작

업데이트: 2007년 11월

이 연습에서는 Microsoft Visual Basic 2005의 기본적인 파일 I/O에 대해 소개합니다. 파일 I/O 기능을 설명하기 위해 FileExplorer라는 작은 응용 프로그램을 작성합니다. 이 응용 프로그램은 디렉터리에 있는 텍스트 파일을 검사하여 특성, 마지막 액세스 시간, 파일의 처음 80자 등의 정보를 제공합니다. 이 응용 프로그램에는 로그 파일에 정보를 기록하는 옵션도 포함됩니다.

참고:

대화 상자에서 사용할 수 있는 옵션과 메뉴 명령의 이름 및 위치는 실제 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 이 도움말 페이지는 일반 개발 설정을 염두에 두고 작성되었습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 Visual Studio 설정을 참조하십시오.

응용 프로그램 만들기

프로젝트를 시작하려면 디렉터리를 선택하고 해당 디렉터리의 파일을 선택하며 해당 파일에서 검색할 정보를 선택할 수 있는 폼을 만들어야 합니다.

프로젝트를 만들려면

  1. 파일 메뉴에서 새로 만들기, 프로젝트를 차례로 클릭합니다.

    새 프로젝트 대화 상자가 나타납니다.

  2. 프로젝트 형식 창에서 Visual Basic 프로젝트를 클릭한 다음 템플릿 창에서 Windows 응용 프로그램을 클릭합니다.

  3. 이름 상자에서 FileExplorer를 입력하여 프로젝트 이름을 설정합니다.

    Visual Studio에서 솔루션 탐색기에 프로젝트가 추가되고 Windows Forms 디자이너가 열립니다.

  4. 다음 표에 나온 컨트롤을 폼에 추가하고 속성에 해당 값을 설정합니다.

    개체

    속성

    TextBox

    Name

    Text

    txtDirectory

    Directory

    Button

    Name

    Text

    btnSubmit

    Submit

    Button

    Name

    Text

    btnExamine

    Examine

    ComboBox

    Name

    Text

    lstFilePick

    Select A File

    CheckBox

    Name

    Text

    Checked

    chkFileLength

    File Length

    True

    CheckBox

    Name

    Text

    Checked

    chkLastAccess

    Last Access Time

    True

    CheckBox

    Name

    Text

    Checked

    chkSave

    Save Results

    False

현재 디렉터리 표시

FileExplorer 응용 프로그램에는 시작 위치가 필요합니다. 따라서 txtDirectoryTextBox에서는 My.Computer.FileSystem.CurrentDirectory 함수를 사용하여 현재 경로를 나타내는 문자열을 반환하고 표시합니다.

현재 디렉터리를 반환하려면

  1. 폼을 두 번 클릭하여 Form1_Load의 이벤트 처리기를 만듭니다.

    코드 편집기가 열립니다.

  2. 다음 코드를 추가하여 txtDirectoryTextBox에 현재 위치가 표시되도록 합니다.

    txtDirectory.Text = My.Computer.FileSystem.CurrentDirectory
    
  3. 프로그램을 실행하여 올바른 경로가 반환되는지 확인합니다.

    txtDirectoryTextBox에 현재 디렉터리가 표시됩니다.

디렉터리 변경

사용자가 다른 디렉터리에 있는 파일을 선택할 수도 있으므로 응용 프로그램에서는 동일한 속성을 사용하여 디렉터리를 전환합니다. 다른 디렉터리로 변경하려면 txtDirectoryTextBox에 새 경로를 입력합니다.

디렉터리를 변경하려면

  1. 폼에서 해당 컨트롤을 두 번 클릭하여 btnSubmit의 클릭 이벤트 처리기를 만듭니다.

    코드 편집기가 열립니다.

  2. 클릭 이벤트 처리기에 다음 코드를 추가합니다.

    Dim NewPath As String
    ' NewPath holds the path the user has entered.
    NewPath = txtDirectory.Text
    ' Change the location to NewPath.
    My.Computer.FileSystem.CurrentDirectory = NewPath
    

입력된 경로의 유효성 확인

Try...Catch 문을 사용하여 빈 경로나 잘못된 경로가 제출될 경우 발생되는 예외를 catch합니다.

경로가 올바른지 확인하려면

  1. btnSubmit_Click 이벤트의 Dim NewPath As String 코드 다음 줄에 Dim ErrorMessage As String 코드를 새로 추가합니다.

  2. My.Computer.FileSystem.CurrentDirectory = NewPath 코드 줄 앞에 줄을 바꾸지 않고 다음과 같이 Try 문을 추가합니다. Return 키를 누르면 자동으로 Catch ex As Exception 및 End Try 문이 삽입됩니다. 다음 단계에서 직접 코드를 추가할 것이므로 방금 추가한 코드를 제거합니다.

    Try
    
  3. My.Computer.FileSystem.CurrentDirectory = NewPath 코드 줄 뒤에 다음 코드를 추가합니다.

        ' This checks to make sure the path is not blank.
    Catch ex As Exception When NewPath = ""
        ErrorMessage = "You must enter a path."
        ' This catches errors caused by a path that is not valid.
    Catch
        ErrorMessage = "You must enter a valid path.  If trying " & _
        "to access a different drive, remember to include the drive " & _
        "letter."
    Finally
        ' Display the error message only if one exists.
        If ErrorMessage <> Nothing Then
            MsgBox(ErrorMessage)
        End If
    End Try
    

ComboBox에 디렉터리 내용 표시

응용 프로그램에서 현재 디렉터리의 내용을 표시하도록 하려면 디렉터리의 이름을 나타내는 문자열의 컬렉션을 반환하는 My.Computer.FileSystem.GetFiles 메서드를 사용합니다. GetFiles에 와일드카드를 사용하면 특정 패턴의 파일만 선택할 수 있습니다. 이 예제에서는 확장명이 .txt인 파일만 반환됩니다.

디렉터리 내용을 표시하려면

  1. btnSubmit_Click 이벤트의 시작 부분에 다음 줄을 삽입합니다.

    Dim fileList As System.Collections.ObjectModel.ReadOnlyCollection(Of String).

  2. End Try 줄 뒤에 다음을 삽입합니다.

    fileList = My.Computer.FileSystem.GetFiles( _
        My.Computer.FileSystem.CurrentDirectory, _
        FileIO.SearchOption.SearchTopLevelOnly, "*.txt")
    For Each foundFile As String In fileList
        lstFilePick.Items.Add(foundFile)
    Next
    

    수집된 정보는 lstFilePickComboBox에 표시되며 이 상자에서 검사할 특정 파일을 선택할 수 있습니다.

이 응용 프로그램을 .txt 파일이 들어 있지 않은 디렉터리에 대해 먼저 실행한 다음 둘 이상의 .txt 파일이 포함된 디렉터리에 대해 실행하는 순서로 테스트합니다. 첫 번째 인스턴스에서 응용 프로그램은 적절한 오류 메시지를 표시합니다. 두 번째 인스턴스에서 응용 프로그램은 txtDirectoryTextBox에 지정된 디렉터리에 있는 모든 .txt 파일의 목록을 ComboBox에 표시합니다.

사용자가 검사할 파일을 선택할 수 있도록 만들기

디렉터리에 있는 모든 파일이 lstFilePickComboBox에 표시되지만 일반적으로 사용자는 특정 파일을 선택하여 검사합니다.

특정 파일을 선택할 수 있도록 하려면

  • btnExamine_Click의 클릭 이벤트 처리기를 만들고 다음 코드를 추가하여 파일이 선택되었는지 확인합니다.

    Dim thisFile As System.IO.FileInfo
    thisFile = My.Computer.FileSystem.GetFileInfo(CStr(lstFilePick.SelectedItem))
    

사용자가 수집할 정보를 결정하도록 설정

lstFilePickComboBox에 파일이 표시되므로 다음 코드를 추가하면 사용자가 보고될 정보를 지정할 수 있습니다. 예를 들어, 어떤 사용자는 파일이 마지막으로 액세스된 날짜만 알고 싶어할 수도 있고, 또 다른 사용자는 파일 크기까지 알고 싶어할 수도 있습니다. 사용자는 확인란(chkLastAccess, chkFileLength)을 선택하거나 선택 취소하여 결과를 사용자 지정합니다.

특정 정보를 표시하려면

  1. btnExamine_Click 이벤트의 시작 부분에서 (lstFilePick.SelectedItem) 뒤에 다음 변수를 선언합니다.

    Dim stringlength As String
    stringLength = "The file's length, in bytes, is: "
    Dim stringLastAccess As String
    stringLastAccess = "The file was last accessed on: "
    Dim LastAccess As Date
    Dim Length As Long
    Dim FirstLine As String = ""
    Dim FinalString As String = ""
    Dim NewName As String
    NewName = CType(lstFilePick.SelectedItem, String)
    
    If NewName = Nothing Then
        MsgBox("You must select a file to examine.")
        Exit Sub
    End If
    

    My.Computer.FileSystem.GetFileInfo 메서드는 파일에 대한 정보를 쿼리할 수 있는 FileInfo 개체를 반환합니다.

  2. 다음 코드를 btnExamine_Click 이벤트의 끝 부분에 추가합니다.

    ' Check last access time.
    If chkLastAccess.Checked = True Then
        LastAccess = thisFile.LastAccessTime
    End If
    

LastAccessTime 속성은 파일이 마지막으로 액세스된 시간을 결정합니다. 반환되는 Date 값은 파일을 만들거나 마지막으로 수정한 날짜와 시간을 나타냅니다.

  1. 다음 코드를 btnExamine_Click 이벤트의 끝 부분에 추가합니다.

    ' Check Length.
    If chkFileLength.Checked = True Then
        Length = thisFile.Length
    End If
    

파일의 길이를 결정하는 Length 속성은 파일의 길이를 바이트 단위로 나타내는 Long 값을 반환합니다.

결과 표시

MsgBox에서는 수집된 정보를 보고하여 응용 프로그램의 기능을 완료합니다.

결과를 표시하려면

  1. chkLastAccessCheckBox가 선택되었는지 여부를 확인하는 If 문의 끝 부분에서 마지막 End If 앞에 다음 코드를 추가합니다.

    ' Add to the messagebox.
    FinalString = FinalString & stringLastAccess & LastAccess & "." _
    & vbCrLf
    
  2. chkFileLengthCheckBox가 선택되었는지 여부를 확인하는 If 문의 끝 부분에서 마지막 End If 앞에 다음 코드를 추가합니다.

    ' Add to the messagebox.
    FinalString = FinalString & stringlength & CStr(Length) & "." _
    & vbCrLf
    
  3. chkFirstLineCheckBox가 선택되었는지 여부를 확인하는 If 문의 끝 부분에서 마지막 End If 앞에 다음 코드를 추가합니다.

    ' Add to the messagebox.
    FinalString &= FirstLine & vbCrLf
    

결과 저장

사용자는 보통 파일 검사 결과를 저장하려고 합니다. 따라서, 로그 파일이 있는지 확인하여 필요한 경우에는 파일을 만든 다음 결과를 로그 파일에 저장하는 코드를 추가합니다.

로그 파일을 만들려면

  • 다음 코드를 btnExamine_Click 이벤트의 끝 부분에 추가합니다.

    ' Check to see if results should be saved.
    If chkSave.Checked = True And FinalString <> "" Then
        My.Computer.FileSystem.WriteAllText("log.txt", FinalString, True)
    End If
    

응용 프로그램을 테스트하려면

  1. 선택한 디렉터리에서 첫 번째 줄이 다음과 같은 test.txt라는 텍스트 파일을 만듭니다.

    "This is the first line of the first file. The FileExplorer application examines only text files."

  2. 같은 디렉터리에서 첫 번째 줄이 다음과 같은 test2.txt라는 두 번째 텍스트 파일을 만듭니다.

    "This is the first line of the second file. The FileExplorer application examines only text files."

  3. 응용 프로그램을 시작합니다.

  4. 잘못된 경로를 입력하고 Submit를 클릭합니다.

    "You must enter a valid path. If trying to access a different drive, remember to include the drive letter."라는 메시지가 나타납니다.

  5. test.txt가 들어 있는 디렉터리의 경로를 입력하고 Submit를 클릭합니다.

    lstFilePickComboBox에 텍스트 파일이 표시됩니다.

  6. lstFilePickComboBox에서 test.txt를 선택합니다. 모든 확인란을 선택한 다음 Examine을 클릭합니다.

    결과 폼에 마지막 액세스 날짜와 길이가 포함됩니다.

  7. lstFilePickComboBox에서 test2.txt를 선택하고, 모든 확인란의 선택을 취소한 다음 Examine을 클릭합니다.

    "No file attribute checkboxes selected."라는 오류 메시지가 나타납니다.

  8. Last Access 및 Save Results를 선택하고 Examine을 클릭합니다.

    결과 폼에 마지막 액세스 시간만 표시됩니다.

  9. FileExplorer를 닫습니다.

    Save Results 옵션을 선택했기 때문에 FileExplorer에서는 텍스트 파일과 동일한 디렉터리에 log.txt라는 로그 파일을 생성합니다.

로그를 확인하려면

  • 현재 디렉터리에서 log.txt를 열고 FileExplorer에서 올바른 정보를 기록했는지 확인합니다.

참고 항목

참조

My.Computer.FileSystem.CurrentDirectory 속성

My.Computer.FileSystem.GetFileInfo 메서드