상세 컨텐츠

본문 제목

FileSystemObject(FSO)의 모든 것

프로그래밍/JAVA

by 라제폰 2009. 1. 23. 17:04

본문

FileSystemObject란 무엇인가?  

 

FileSystemObject(흔히 FSO라고 부름)는 웹 서버의 파일 시스템에 접근할 때 흔히 사용되는 콤포넌트이다. 예를 들어, 파일을 만들 수도 있고, 파일의 내용을 읽을 수도 있고, 폴더나 파일의 존재 여부도 알아낼 수 있다. 이 외에도 파일 시스템과 관련된 많은 일들을 이 개체를 통해 할 수 있다. ASP 페이지에서 FileSystemObject 개체의 인스턴스를 만들려면 아래와 같이 해주면 된다:

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

일단 이 개체의 인스턴스를 만들면 이 개체의 많은 메소드와 속성을 이용할 수 있게 된다. 예를 들어 C:\SomeFile.txt의 파일 내용을 출력하길 원한다고 하자. 간단하다. 다음과 같이 해주면 된다.:

Const fsoForReading = 1
 
Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
'텍스트 파일을 연다
Dim objTextStream
Set objTextStream = objFSO.OpenTextFile("C:\SomeFile.txt", fsoForReading)
 
'텍스트 파일의 내용을 출력한다
Response.Write objTextStream.ReadAll
 
'파일을 닫는다
objTextStream.Close
Set objTextStream = Nothing
Set objFSO = Nothing

다음 장에서 텍스트 파일을 읽는 것과 관련된 더 자세한 내용을 다룰 것이다. 여기서는 FileSystemObject의 용도를 아는 것으로 만족하자. ASP 페이지는 웹 서버 상에 존재하므로 ASP 페이지 상에서 생성된 FSO 개체는 웹 서버의 파일 시스템에 접근하게 된다. (물론 FSO는 웹 서버에만 접근할 수 있는 것이 아니라 모든 물리적인 파일 시스템에 접근할 수 있다.) 하지만 FSO 개체를 이용해 클라이언트의 파일 시스템을 접근할 수는 없다.

FileSystemObject를 사용할 때 기억해야 할 중요한 것 한 가지는 "권한"부분이다. 윈도 NT에서는 3가지의 권한이 있다: Read, Write 및 Full Access. ASP 페이지가 FSO 개체를 이용해 파일 시스템의 명령을 사용하고자 할 때 익명(anonymous)의 사용자 ID (IUSR_machinename, 만일 웹 서버 이름이 daniel이라면 IUSR_daniel)가 사용된다. 만일 IUSR_machinename이 특정 디렉토리 접근 권한이 없다면 ASP 페이지를 통해 그 디렉토리에 파일을 쓰기 위해 FSO 개체를 이용할 수 없다.

 

FSO를 이용한 텍스트 파일 읽기

 

앞 장에서 우리는 FSO의 용도는 파일 시스템 접근이라고 배웠다. 컴퓨터 파일 시스템 접근에 있어서 가장 기본은 파일의 내용을 읽어들이는 것이다. FSO는 텍스트 파일을 읽고 쓸 때 아주 유용한 TextStream 개체를 제공한다. 이 장에서는 TextStream 개체를 이용해 파일의 내용을 어떻게 읽어 들이는지에 대해 알아볼 것이다.

TextStream 개체를 사용할 때 제일 먼저 해야할 일은 FileSystemObject 개체의 인스턴스를 만드는 것이다. 다음은 그 예이다:

' FileSystemObject 개체의 인스턴스 생성
Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

파일을 열기 전에 항상 점검해야할 일이 있다. 그것은 바로 그 파일이 존재하는지를 알아내는 것이다. FileSystemObject는 파일의 존재 여부를 알 수 있는 유용한 함수를 제공한다. 그것은 바로 FileExists이다. FileExists의 문법은 다음과 같다:

FileSystemObjectInstance.FileExists(FullFilePath)

여기서 우리는 D:\scott\resume.txt 파일 내용을 웹 페이지 상에 출력할 것이다. 이 파일을 열기 전에 그 파일이 존재하는지 체크해야할 것이다.

앞에서 언급했듯이 TextStream 개체는 텍스트 파일의 입출력을 담당할 것이다. TextStream을 사용하기 전에 사용할 텍스트 파일이 어떤 것인지 TextStream 개체에 알려 줘야 한다. 이것은 FileSystemObjectOpenTextFile 메소드를 이용하여 할 수 있다. OpenTextFile 메소드 문법은 다음과 같다:

FileSystemObjectInstance.OpenTextFile(FullFilePath[, iomode])

iomode 파라미터는 디폴트는 아니지만 파일이 열릴 때 어떤 모드로 열릴 것인지를 결정해 준다. 이 값은 다음과 같다:

iomode Values
ForReading 1
ForWriting 2
ForAppending 8

여기서 ForReading과 같은 이름은 정의되어 있지 않다. iomode에 값을 설정할 때 이 이름들을 사용하려면 미리 상수 선언을 다음과 같이 해줘야 한다:

Const fsoForReading = 1

OpenTextFile 메소드는 TextStream 개체의 인스턴스를 반환한다. 그러므로 특정 파일의 내용을 읽어 들이기 위해 어떤 변수에 TextStream 개체 인스턴스를 할당하려면 다음과 같이 하면 된다:

'FileSystemObject 개체 이름이 objFSO 라고 가정하고 Const fsoForReading = 1은 미리 정의 되어 있다고 가정
Dim objTextStream
Set objTextStream = objFSO.OpenTextFile("C:\SomeFile.txt", fsoForReading)

TextStream 개체는 텍스트 파일을 읽기 위한 아래와 같은 중요한 메소드들을 가지고 있다:

  • Read(characters) - 텍스트 파일의 특정 캐릭터를 읽어 들인 후 읽어 들인 문자열을 반환한다.
  • ReadLine - 뉴 라인 값은 뺀 채 한 줄 전체를 읽어 들여 문자열로 반환한다.
  • ReadAll - 파일 내용 전체를 읽어들인 후 문자열로 반환한다.

마지막으로 알아야할 게 있다. TextStream 개체에는 Close 란 메소드가 있는데 파일로부터 읽어들인 작업을 끝낸 후 반드시 Close 메소드를 사용해야 한다.

자, 지금까지 살펴본 내용을 가지고 D:\scott\resume.txt 파일 내용을 읽어 들여 출력하는 부분을 작성해 보도록 하자

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
Dim objTextStream
 
const strFileName = "D:\scott\resume.txt"
const fsoForReading = 1
 
If objFSO.FileExists("D:\scott\resume.txt") then
        '파일이 존재하면 파일을 열고 그 내용을 출력한다
        Set objTextStream = objFSO.OpenTextFile(strFileName, fsoForReading)
        Response.Write objTextStream.ReadAll
        objTextStream.Close
        Set objTextStream = Nothing
Else
        '파일이 존재하지 않으면
        Response.Write strFileName & " was not found."
End If
 
'생성된 개체 해제
Set objFSO = Nothing

 

 

FSO를 이용한 텍스트 파일 쓰기

 

우리는 앞 과에서 FSO(FileSystemObject)와 TextStream 개체를 이용하여 텍스트 파일의 내용을 읽어들이는지에 대해 살펴 보았다. 이 과에서는 이 두 개체를 이용하여 원하는 내용을 텍스트 파일에 쓰는 것에 대해 살펴 보겠다.

지난 과에서 FSO 개체의 OpenTextFile 메소드를 이용하여 텍스트 파일을 열었었다. 이 OpenTextFile 메소드에는 두 개의 파라미터가 있었다는 것도 배웠었다. 만일 텍스트 파일에 어떤 내용을 쓰고자 할 때에는 OpenTextFile 메소드에 세 번째 파라미터가 필요하다. 이 세 번째 파라미터는 두 번재 파라미터처럼 옵션이다. 세 번째 파라미터의 값은 불린(boolean) 형식이다. 이 세 번째 파라미터까지 적용한 OpenTextFile 메소드의 형식은 다음과 같다:

FileSystemObjectInstance.OpenTextFile(FullFilePath[, iomode[, Created]])

잠깐: 사실 옵션으로 있는 파라미터가 하나 더 있다. 하지만 여기서는 세 개의 파라미터만 알면 되므로 그냥 넘어가기로 한다.

옵션 파라미터인 iomode는 파일이 열릴 IO 모드를 결정해 준다. 사용될 수 있는 값은 다음과 같다:

iomode Values
ForReading 1
ForWriting 2
ForAppending 8

여기서 ForWriting과 같은 이름은 정의되어 있지 않다. iomode에 값을 설정할 때 이 이름들을 사용하려면 미리 상수 선언을 다음과 같이 해줘야 한다:

Const fsoForWriting = 2

Create 파라미터는 지정한 파일(FullFilePath)이 존재하지 않을 때 새로운 파일을 만들지 아닐지를 결정한다. Create 속성은 디폴트가 False이다. 만일 존재하지 않는 파일에 쓰고자 하면서 Create 속성이 False면 에러가 발생할 것이다.

TextStream 개체는 텍스트 파일에 쓰는 것과 관련된 다음과 같은 중요한 메소드들을 갖고 있다:

  • Write(string) - 텍스트 파일에 string 내용을 쓴다.
  • WriteLine([string]) - 텍스트 파일에 string 내용을 쓰고 뉴 라인 캐릭터(new line character)를 붙여 준다.
  • WriteBlankLines(lines) - 뉴 라인 캐릭터를 지정한 숫자만큼 써준다.

TextStream 개체를 이용한 작업을 마친 후에는 Close 메소드를 이용하여 개체를 닫아 준다.

이제 존재하는 파일 C:\Welcome.txt에 몇 줄 추가하는 것을 살펴 보도록 하자:

Const fsoForAppend = 8
 
Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
'텍스트 파일을 수정 모드로 연다.
Dim objTextStream
Set objTextStream = objFSO.OpenTextFile("C:\Welcome.txt", fsoForAppend)
 
'텍스트 파일의 내용을 파일에 쓴다.
objTextStream.WriteLine "안녕하세요!"
objTextStream.WriteLine "재미있는 FSO 개체 실습입니다!!"
 
'TextStream 개체를 닫는다.
objTextStream.Close
Set objTextStream = Nothing
Set objFSO = Nothing

여기서 OpenTextFile의 Create 파라미터는 생략되어 있으므로 디폴트 값인 False로 설정 된다. 만일 C:\Welcome.txt 파일이 존재하지 않으면 에러가 발생할 것이다. 만일 파일이 존재한다면 "안녕하세요!"와 "재미있는 FSO 개체 실습입니다!!" 문자열이 그 파일에 추가될 것이다.

이번엔 "안녕하세요? 여러분!"이란 내용이 담긴 파일을 새로 만들어 보도록 하자:

Const fsoForWriting = 2
 
Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
'텍스트 파일을 연다.
Dim objTextStream
Set objTextStream = objFSO.OpenTextFile("C:\SomeFile.txt", fsoForWriting, True)
 
'텍스트 파일에 원하는 내용을 출력한다.
objTextStream.WriteLine "안녕하세요? 여러분!"
 
'TextStream 개체를 닫는다.
objTextStream.Close
Set objTextStream = Nothing
Set objFSO = Nothing

OpenTextFile의 Create 파라미터 값이 True이기 때문에 만일 C:\SomeFile.txt 파일이 존재하지 않으면 파일을 새로 만든 후 "안녕하세요? 여러분!" 이란 내용을 그 파일에 기록할 것이다.

여기서 주의해야할 것은 권한 문제이다. 만일 쓰기 권한이 없다면 에러가 발생할 수도 있기 때문이다.

다음 장에서는 파일을 복사하고, 이동하고, 삭제하는 것에 대해 다룰 것이다.

 

 FSO를 이용한 파일 복사, 이동, 삭제

 

파일을 복사하고, 이동하고, 삭제하는 것은 일상적으로 하는 작업이다. FileSystemObject 개체는 이 작업들을 가능하도록 지원하고 있다. 이 각각의 작업에 대한 메소드는 다음과 같다:

  • CopyFile source, destination[, overwrite]
  • MoveFile source, destination
  • DeleteFile FullFilePath[, force]

overwrite 파라미터의 디폴트 값은 True이고, force 파라미터의 디폴트 값은 False이다.

이것들은 모두 FSO 개체의 메소드들이다. ASP 페이지에서 이것을 사용할 때는 FSO 개체를 먼저 생성해야 한다. 만일 C:\InetPub\wwwroot 에 있는 모든 *.htm 파일들을 C:\windows\desktop 폴더로 복사하고 싶다면 다음과 같이 하면 된다:

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
objFSO.CopyFile "C:\InetPub\wwwroot\*.htm", "C:\Windows\Desktop"
 
Set objFSO = Nothing

여기서도 "권한"은 중요한 문제이다. IUSR_macjinename 사용자 ID가 하 디렉토리에서 다른 디렉토리로 파일을 복사할 수 있는 권한을 갖고 있어야 한다.

MoveFile 메소드도 CopyFile 메소드와 비슷하다. 단 이동될 파일이 source 디렉토리에서 삭제되고 destination 디렉토리로 복사된다. 그러므로 IUSR_machinename 계정은 source 디렉토리에서의 삭제 권한과 destination 디렉토리에서의 쓰기 권한이 있어야 한다.

DeleteFile 메소드는 하나 또는 그 이상의 파일을 삭제할 때 사용한다. FullFilePath는 하나의 파일을 지정할 수도 있고 와일드 카드 문자(*)를 이용해 다중 파일을 지정해 줄 수도 있다. 예를 들어, C:\InetPub\wwwroot 디렉토리에 있는 모든 .asp 파일을 삭제하고 싶다면 다음과 같이 하면 된다:

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
objFSO.DeleteFile "C:\InetPub\wwwroot\*.asp", False
 
Set objFSO = Nothing

DeleteFile메소드에서 옵션 파라미터인 force는 디폴트 값이 False이다. 이것은 읽기-전용 속성을 지닌 파일도 삭제해야 할지 말지를 결정해 준다. force 값이 True인 경우에만 읽기-전용 속성 파일을 삭제할 수 있다.

FileSystemObject 개체는 파일 시스템의 드라이브, 디렉토리, 파일에 관한 많은 정보들을 제공해 준다. 우리는 다음 장에서 이 정보들을 어떻게 얻어 오는지에 대해 살펴볼 것이다.

 

 FSO을 이용한 파일 시스템 정보 수집

 

 

파일을 복사하고, 이동하고, 삭제하는 것은 일상적으로 하는 작업이다. FileSystemObject 개체는 이 작업들을 가능하도록 지원하고 있다. 이 각각의 작업에 대한 메소드는 다음과 같다:

  • CopyFile source, destination[, overwrite]
  • MoveFile source, destination
  • DeleteFile FullFilePath[, force]

overwrite 파라미터의 디폴트 값은 True이고, force 파라미터의 디폴트 값은 False이다.

이것들은 모두 FSO 개체의 메소드들이다. ASP 페이지에서 이것을 사용할 때는 FSO 개체를 먼저 생성해야 한다. 만일 C:\InetPub\wwwroot 에 있는 모든 *.htm 파일들을 C:\windows\desktop 폴더로 복사하고 싶다면 다음과 같이 하면 된다:

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
objFSO.CopyFile "C:\InetPub\wwwroot\*.htm", "C:\Windows\Desktop"
 
Set objFSO = Nothing

여기서도 "권한"은 중요한 문제이다. IUSR_macjinename 사용자 ID가 하 디렉토리에서 다른 디렉토리로 파일을 복사할 수 있는 권한을 갖고 있어야 한다.

MoveFile 메소드도 CopyFile 메소드와 비슷하다. 단 이동될 파일이 source 디렉토리에서 삭제되고 destination 디렉토리로 복사된다. 그러므로 IUSR_machinename 계정은 source 디렉토리에서의 삭제 권한과 destination 디렉토리에서의 쓰기 권한이 있어야 한다.

DeleteFile 메소드는 하나 또는 그 이상의 파일을 삭제할 때 사용한다. FullFilePath는 하나의 파일을 지정할 수도 있고 와일드 카드 문자(*)를 이용해 다중 파일을 지정해 줄 수도 있다. 예를 들어, C:\InetPub\wwwroot 디렉토리에 있는 모든 .asp 파일을 삭제하고 싶다면 다음과 같이 하면 된다:

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
objFSO.DeleteFile "C:\InetPub\wwwroot\*.asp", False
 
Set objFSO = Nothing

DeleteFile메소드에서 옵션 파라미터인 force는 디폴트 값이 False이다. 이것은 읽기-전용 속성을 지닌 파일도 삭제해야 할지 말지를 결정해 준다. force 값이 True인 경우에만 읽기-전용 속성 파일을 삭제할 수 있다.

FileSystemObject 개체는 파일 시스템의 드라이브, 디렉토리, 파일에 관한 많은 정보들을 제공해 준다. 우리는 다음 장에서 이 정보들을 어떻게 얻어 오는지에 대해 살펴볼 것이다.

 

FSO을 이용한 파일 시스템 정보 수집

 

 

FileSystemObject는 여러 가지 컬렉션(collections)을 가지고 있다. 이 각각의 컬렉션은 웹 서버 파일 시스템의 특별한 정보들을 갖고 있다. 이 컬렉션은 다음과 같다:

  • Drives : 하드 드라이브는 물론 플로피, CD-ROM 드라이브까지 컴퓨터 파일 시스템의 다양한 드라이브 정보를 갖고 있다.
  • SubFolders - 주어진 폴더의 하위 폴더 내용을 갖고 있다.
  • Files - 주어진 폴더의 모든 파일 리스트를 가지고 있다.

이 세 가지 컬렉션과 연관 있는 세 개의 개체가 있다. 이 개체들은 각각 Drive 개체, Folder 개체, 그리고 File 개체이다. 이 각각의 계층 구조는 다음과 같다:

The FileSystemObject hierarchy

FileSystemObject는 간접적으로 drive, folder, file 정보를 모두 갖고 있다. 직접적으로는 Drive1부터 Drive N까지의 개체를 포함하는 Drives 컬렉션만 갖고 있다. Drives 컬렉션에 있는 각각의 Drive 개체들은 Folder개체를 가지고 있고 또 각각의 Folder 개체들은 Files 컬렉션을 갖고 있다.

FileSystemObject는 특정 Drive, Folder, File 개체에 대한 참조 값을 반환하는 세 가지 함수 GetDrive, GetFolder, 그리고 GetFile 함수를 갖고 있다. 이 세가지 함수는 각각 적절한 개체 타입을 반환한다. 만일 특정 파일에 대한 특정 정보(가령, 최종 수정일 또는 파일 크기)를 얻고 싶다면 특정 파일에 대한 정보를 갖고 있는 File 개체를 참조하기 위해 GetFile 메소드를 사용할 수 있을 것이다.

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
'파일 정보를 담고 있는 개체를 얻어 옴
Dim objFile
Set objFile = objFSO.GetFile("C:\Windows\System.ini")
 
'File 개체의 속성 중 일부 출력
Response.Write "Name: " & objFile.Name & "&kiclt;br&kicgt;"
Response.Write "Size: " & objFile.Size & "&kiclt;br&kicgt;"
Response.Write "Last Modified: " & objFile.DateLastModified & "&kiclt;br&kicgt;"
 
'Clean up
Set objFile = Nothing
Set objFSO = Nothing

참조: 여기서는 그렇게 작성하지 않았지만, 만일 GetFile 메소드를 사용하려면 FileExists 메소드를 통해 그 파일 여부가 존재하는지 체크하는 것이 좋다.

File 개체 속성에 대한 자세한 정보는 마이크로소프트 스크립팅 사이트에서 찾을 수 있을 것이다.

어떤 특정 폴더를 참조하려면 GetFolder 메소드를 사용하면 된다. 어떤 폴더에 있는 모든 파일을 참조하기 위해 Files 컬렉션을 사용할 수 있다. 예를 들어, C:\InetPub\wwwroot 디렉토리에 있는 모든 파일 이름을 출력하려면 다음과 같이 할 수 있다:

Dim objFSO
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 
'폴더에 대한 참조
Dim objFolder
Set objFolder = objFSO.GetFolder("C:\InetPub\wwwroot")
 
Response.Write "The files found in " & objFolder.Name & ":&kiclt;br&kicgt;"
 
'Files 컬렉션 반복
Dim objFile
For Each objFile in objFolder.Files
  Response.Write objFile.Name & "&kiclt;br&kicgt;"
Next
 
'Clean up!
Set objFolder = Nothing
Set objFile = Nothing
Set objFSO = Nothing

여기서도 마찬가지인데, GetFolder를 사용하기 전에 FolderExists 메소드를 통해 참조하려는 폴더의 존재 유무를 먼저 체크하는 것이 바람직하다.

Drive, Folder, File 개체를 이용하여 할 수 있는 일은 참으로 많이 있다. 여기서 모든 것을 다루기에는 한계가 있으므로 이와 관련된 내용은 차차 다루기로 하자.

 

FSO를 이용한 원격 컴퓨터상의 파일 접근

 

 

FSO를 이용하여 다른 컴퓨터에 있는 텍스트 파일을 열거나 만들 수 있다. 그 때 컴퓨터는 같은 네트워크 그룹에 있어서 파일 공유가 가능한 컴퓨터여야 한다. 이런 조건만 충족된다면 다음과 같은 방법을 이용할 수 있다:

Const ForReading = 1
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set MyFile = objFSO.OpenTextFile("\\&kiclt;machinename&kicgt;\myfile.txt", ForReading)

다른 컴퓨터에 있는 파일을 조작할 때는 보안 문제 때문에 어려운 부분이 많다. 이와 관련된 더 자세한 내용은 마이크로소프트 홈페이지를 참조하기 바란다.


관련글 더보기