본문 바로가기

Window Programming/VB

드라이브, 폴더, 파일처리 FSO(File System Object)

visual basic6.0부터는 Open문을 사용해 파일만을 처리했던 구 버전과는 달리 파일은 물론, 드라이브, 폴더까지 다룰 수 있는 FSO(File System Object)모델을 소개하고 있다. FSO모델을 사용하면 폴더를 작성, 변경, 이동, 삭제뿐만 아니라 폴더에 대해 여러가지 정보를 얻을 수 있다. 또한 파일을 쉽게 처리할 수 있다.  파일을 처리하는 주요목표는 공간과 컴퓨터자원을 효율적으로 사용하고 접근하기 쉬운 데이터를 저장하는 것이다. 이러한 파일처리목표를 달성할 수 있는 것이 FSO모델이다.

파일시스템개체(FSO)구성

FSO모델의 개체구성원을 사용하려면 먼저 [프로젝트-참조]메뉴를 선택해 참조대화상자에서 "Microsoft Scripting Runtime"을 선택해야 한다.

Scripting형식 라이브러리를 참조했다면 [보기-개체찾아보기]메뉴를 선택하여 개체찾아보기 대화상자에서 Scripting라이브러리를 선택하면 개체에 들어 있는 다양한 속성과 메서드 그리고 이벤트에 대한 내용을 볼 수 있다. FSO모델은 아래와 같이 대표적인 개체로 구성되어 있다.

  • drive
    시스템에서 사용할 수 있는 디스크공간, 디스크의 공유이름과 같은 디스크정보를 얻을 수 있게 해준다. "drive"에는 하드디스크 이름이외에도 cd-rom드라이브, ram디스크와 같은 이름을 사용할 수 있다.
  • folder
    폴더를 만들고 삭제하고 이동할 수 있도록 해주며 이름과 경로 등에 대하여 시스템에 쿼리할 수 있게 한다.
  • files
    파일을 만들고 삭제하고 이동할 수 있도록 해주며 이름과 경로 등에 대하여 시스템에 쿼리할 수 있게 한다.
  • FileSystemObject
    그룹의 주 개체로 드라이브, 폴더, 파일을 일반적으로 조작하고 만들고 삭제하고 정보를 얻을 수 있도록 해주는 메서드가 들어있다.  이 개체와 연관된 많은 메서드들은 다른 개체에 들어있는 메서드들과 중복되어 있다.
  • textStream
    텍스트파일을 읽고 쓸 수 있게 한다.

FSO모델 프로그래밍

이러한 FSO모델로 드라이브, 폴더, 파일을 다루려면 다음과 같은 3가지작업이 필요하다.

  • CreateObject메서드를 사용하거나 변수를 FileSystemObject개체로 선언하여 FileSystemObject개체를 하나 만든다.
  • 새로 만든 개체에 적절한 메서드를 사용한다.
  • 개체의 속성을 엑세스한다.

FileSystemObject개체 만들기

첫째 작업은 작업할 FileSystemObject개체를 만드는 것으로, 다음 두가지 방법이 있다.

dim fso as new FileSystemObject  '변수를 FileSystemObject개체형식으로 선언 또는
set fso = CreateObject("scripting.FileSystemObject")  'CreateObject메서드를 사용하여 FileSystemObject개체를 만든다.

적절한 메서드사용

다음 작업은 FileSystemObject개체의 적절한 메서드를 사용하는 것이다.
예를 들어, 폴더에 대해선 CreateFolder메서드를 사용하여 폴더를 작성한다거나 MoveFolder메서드를 사용해 폴더를 이동할 수 있다.

개체의 속성 엑세스

개체에 대한 핸들을 얻으면 get메서드를 사용하여 개체의 정보를 액세스할 수 있다. 예를 들어 특정폴더의 이름을 얻으려면 먼저 해당개체의 인스턴스를 하나 만들고 적절한 메서드를 사용하여 인스턴스에 대한 핸들을 얻을 수 있다. 다음은 이러한 3가지 단계를 이용해 새 폴더를 만들어보고, 기존 폴더에 대한 정보를 액세스하는 예제코드이다.

Private Sub Form_Click()
    Dim fso As New FileSystemObject, existF, newF As Folder

    Set newF = fso.CreateFolder("c:\my documents\test")
    Set existF = fso.GetFolder("c:\my documents")

    Debug.Print "새 폴더이름 :"; newF.Name
    Debug.Print "기 폴더이름 :"; existF.Name
    Debug.Print "새 폴더 작성시간 :"; newF.DateCreated
    Debug.Print "기 폴더 작성시간 :"; existF.DateCreated
End Sub

이 예제코드에서 createFolder메서드를 사용하여 새폴더를 만들 때는, name, path, dateCreated와 같은 속성을 액세스하는데 getFolder메서드를 사용할 필요가 없다. 반면에 기존에 있는 폴더의 속성을 액세스하려면 반드시 getFolder메서드가 필요함을 보여주고 있다.

drive개체에는 폴더나 파일개체처럼 새로 만들고, 지우거나, 복사는 할 수 없지만 드라이브정보를 다음과 같은 속성을 통해 얻을 수 있다.

속 성 설 명
totalSize 바이트단위로 된 드라이브의 전체크기
availableSpace freeSpace바이트 단위로 된 드라이브에서 사용할 수 있는 공간
driveLetter 드라이브에 지정된 글자
driveType 휴대용, 고정, 네트워크, cd-rom, ram디스크같은 드라이브 종류
serialNumber 드라이브의 일련번호
fileSystem fat, fat32, ntfs등과 같이 드라이브가 사용하는 파일시스템의 형식
isReady 드라이브를 사용할 수 있는지의 여부속성
shareName 공유 드라이브명
volumeName 지정한 드라이브의 볼륨명
path 드라이브 경로
rootFolder 루트폴더

아래 예제는 drive개체를 사용하여 드라이브에 대한 정보를 수집하는 방법을 보여준다. 아래 코드에서 실제 drive개체에 대한 참조를 볼 수 없다는 것을 명심하기 바란다. 대신 getDrive메서드를 사용하여 기존 drive개체(여기서는 drv)에 대한 참조를 얻을 수 있다.

Private Sub Form_Click()
    Dim fso As New FileSystemObject, drv As Drive, s As String
    Set drv = fso.GetDrive(fso.GetDriveName("c:"))

    s = "드라이브 c: " & "[" & drv.VolumeName & "]" & vbCrLf
    s = s & "전체 사용가능공간: "
    s = s & FormatNumber((drv.TotalSize / 1024) / 1024, 0) & "MB" & vbCrLf
    s = s & "빈 공간: " & FormatNumber((drv.FreeSpace / 1024) / 1024, 0) & "MB"
    MsgBox s
End Sub

표준경로 문자열에 대해 getDrive메서드를 호출하려면 getDriveName을 사용하여 drivespec사용에 알맞은 문자열을 가져와야 한다. getDriveName메서드는 지정된 경로의 드라이브 이름을 포함하는 문자열을 반환한다.

  • formatNumber메서드 : 숫자로 서식화된 식을 반환한다.
  • vbCrLf상수 : "chr(13) & chr(10)" 즉, 캐리지리턴과 라인피드조합

폴더작업

메서드 설 명
fileSystemObject.createFolder 폴더 작성
folder.delete 또는 fileSystemObject.deleteFolder 폴더 삭제
folder.move 또는 fileSystemObject.moveFolder 폴더 이동
folder.copy 또는 fileSystemObject.copyFolder 폴더 복사
folder.name 폴더이름 검색
fileSystemObject.folderExists 해당폴더 존재확인
fileSystemObject.getFolder 기존 폴더개체의 인스턴스를 가져옴
fileSystemObject.getParentFolderName 상위폴더의 이름찾기
fileSystemObject.getSpecialFolder 시스템폴더의 경로찾기

아래 예제는 folder와 fileSystemObject개체를 사용하여 폴더를 조작하고 폴더에 대한 정보를 얻는 방법을 보여주고 있다.

Private Sub Form_Click()
    Dim fso As New FileSystemObject, folder1 As Folder
    Set folder1 = fso.GetFolder("c:")         '현재폴더의 이름을 가져옴

    Print folder1
    Print fso.GetParentFolderName(folder1)    '현재폴더의 상위폴더
    Print fso.GetAbsolutePathName("c:\\\")    'c:\경로 반환

    If folder1.IsRootFolder Then              '루트폴더인지 확인
        Print "루트폴더입니다."
    Else
        Print "루트폴더가 아닙니다."
    End If

    Set folder1 = fso.GetSpecialFolder(SystemFolder)
    Print folder1                             '시스템폴더가 있는 경로를 알려준다.
    fso.CreateFolder ("c:\bonus")
    fso.DeleteFolder ("c:\bonus")
End Sub

getAbsolutePatnName메서드는 제공된 경로 지정 이름에서 완전하고 분명한 경로를 반환한다.
현재 디렉터리를 c:\mydocuments\reports라고 가정하고 아래 표에 GetAbsolutePathName 메서드의 작동을 설명한다.

pathspec 반환되는 경로
"c:" "c:\mydocuments\reports"
"c:.." "c:\mydocuments"
"c:\\\" "c:\"
"c:*.*\may97" "c:\mydocuments\reports\*.*\may97"
"region1" "c:\mydocuments\reports\region1"
"c:\..\..\mydocuments" "c:\mydocuments"

getSpecialFolder메서드는 지정된 특정한 폴더의 경로를 반환해 준다.

상수 설명
WindowsFolder 0 Windows 폴더에는 Windows 운영 체제로 설치한 파일존재
SystemFolder 1 System 폴더에는 라이브러리, 글꼴 및 장치 드라이버가 존재
TemporaryFolder 2 임시 파일을 저장하기 위한 Temp 폴더

텍스트 파일이 작성된 뒤 파일에 데이터를 추가하려면 다음 단계를 밟으면 된다.

  • 파일열기
    file.openAsTextStream 또는 fileSystemObject.openTextFile
  • 데이터추가
    write 또는 writeLine과 writeBlankLines 모두 textStream개체로 writeLine메서드는 지정된 문자열 끝에 줄바꿈 문자를 추가하고 커서를 다음라인 첫칸으로 이동한다. writeBlankLines메서드는 새 줄을 텍스트파일에 추가하는 것이다.
  • 파일닫기
    textStream.close

아래 예제는 3개의 쓰기 메서드 모두를 사용하여 파일을 열고 데이터를 추가하고 파일을 닫도록 한다.

Private Sub Command1_Click()
    Dim fso, txtfile
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txtfile = fso.CreateTextFile("c:\my documents\test.txt", True)

    txtfile.Write ("테스트용입니다. ")
    txtfile.WriteLine ("테스트 1, 2, 3")
    txtfile.WriteBlankLines (3)
    txtfile.Write ("3줄 다음입니다.")
    txtfile.Close
End Sub

파일읽기

텍스트파일에서 데이터를 읽으려면 다음 메서드들이 사용된다. 이들은 모두 textStream개체들이다.

메서드 설명
read 파일에서 지정된 개수의 문자를 읽는다.
readLine 줄바꿈 문자(줄바꿈 문자제외)까지 한 줄 전체를 읽는다.
readAll 텍스트파일의 전체내용을 읽는다.
skip 지정한 문자를 뛰어 넘어 읽는다.
skipLine 지정한 줄을 뛰어 넘어 읽는다.

다음은 파일을 작성하여 쓰고, 다시 읽는 예제코드이다.

Private Sub Command1_Click()
    Dim fso As New FileSystemObject, txtfile, fil1 As File, ts As TextStream
    fso.CreateTextFile ("c:\my documents\read.txt")

    Set fil1 = fso.GetFile("c:\my documents\read.txt")
    Set ts = fil1.OpenAsTextStream(ForWriting)

    ts.WriteLine "안녕하십니까?"
    ts.WriteLine "반갑습니다."
    ts.Close

    Set ts = fil1.OpenAsTextStream(ForReading)

    Print ts.ReadLine
    Print ts.Read(3)
    ts.Close
End Sub

파일 이동, 복사, 삭제

FSO모델에는 파일을 이동하고 복사하고 삭제하기 위한 메서드가 다음표처럼 각각 두개씩 있다.

메서드 설명
file.move 또는 fileSystemObject.moveFile 파일 이동
file.copy 또는 fileSystemObject.copyFile 파일 복사
file.delete 또는 fileSystemObject.DeleteFile 파일 삭제

아래 예제는 c드라이브의 내문서폴더에 텍스트파일을 만들고 그 파일에 대한 정보를 작성하여 \tmp라는 폴더로 이동하고 \temp라는 폴더에 사본을 만들고 두 폴더 모두에서 사본들을 삭제한다. 이 예제를 실행하려면 내 문서폴더에 temp폴더와 tmp폴더가 있어야 한다.

Private Sub Command1_Click()
    Dim fso As New FileSystemObject, txtfile As TextStream, fil1, fil2 As File

    Set txtfile = fso.CreateTextFile("c:\my documents\test.txt", True)
    txtfile.Write ("테스트용입니다.")
    txtfile.Close

    Set fil1 = fso.GetFile("c:\my documents\test.txt")  '지정파일에 대한 핸들을 가져온다.
    fil1.Move ("c:\my documents\tmp\test.txt")
    fil1.Copy ("c:\my documents\temp\test.txt")

    Set fil1 = fso.GetFile("c:\my documents\tmp\test.txt")
    Set fil2 = fso.GetFile("c:\my documents\temp\test.txt")
    fil1.Delete
    fil2.Delete
End Sub