[문과 코린이의 IT 기록장] ASP 파일 - FileSystemObject(FSO) (FileSystemObject(FSO) 다루기, 드라이브 다루기, 파일 다루기, 파일 생성, 파일 쓰기, 파일 읽기)
1. FileSystemObject(FSO) 다루기
* Server개체 내, CreateObject 메소드 참고
- ASP 페이지는 그 자신만으로는 파일을 다룰 수가 없으며, 파일을 다루는 컴포넌트인 FileSystemObject의 도움을 받아서 파일을 제어할 수 있다. 그러나 FileSystemObejct나, ADO 같은 것은, ASP.DLL에 들어있지 않고 따로 제공되어 진다.
- 이와 같이 ASP 페이지에서 ASP.DLL에 포함되지 않은 외부에서 제공되는 객체들을 사용하려면, CreateObject 메소드로 그 객체의 인스턴스를 만드는 방법으로 사용이 가능하다.
- 따라서, 외부에서 제공되는 모든 객체는, 그 프로그램 ID만 알고 있다면 ASP 페이지에서 코드를 통해 해당 객체의 인스턴스를 만들 수 있고, 그 객체가 가진 모든 기능을 사용할 수 있게 된다.
ex 1. Set adoCon = Server.CreateObject("ADODB.Connection")
// ADODB.Connection : ADO 커넥션 객체의 프로그램 id.
// 이후 adoCon이라는 객체변수를 사용하여, Connection 개체가 제공하는 모든 메소드와 속성(프로퍼티)을 사용할 수 있게 된다.
ex 2. Set oFSO = Server.CreateObject("Scripting.FileSystemObject")
// Scripting.FileSystemObject: 파일 시스템 포브잭트 객체의 프로그램 id
// 이후 ofFO라는 객체변수를 사용해, FileSystemObejct 개체가 제공하는 모든 메소드와 속성(프로퍼티)을 사용할 수 있게 된다.
1) FileSystemObject(FSO) 역할
웹 상 서버측에서 파일관련 처리는, FileSystemObject(FSO)스크립트 객체가 거의 해결해 주고 있다.
이 객체를 사용하면 얻을 수 있는 것?
- 웹 상에서, 동적으로 디렉토리 생성 / 디렉토리 삭제 / txt파일 생성 / txt파일 편집 / txt파일 삭제 등이 가능하다.
- 그러나 이 객체는, 서버에서 동작하는 것이지, 클라이언트를 제어하는 것은 아니다. 즉 클라이언트 시스템의 파일을 지우고 생성할 수 있다는 것이 아니다.
2) FileSystemObject(FSO) 사용 방법
(1) 생성
- Server객체의 CreateObject 메서드를 사용해, FileSystemObject 객체의 인스턴스를 만들고, 관련 적절한 메서드를 사용한다.
* 이 개체는 외부에서 제공되는 것이기에, 반드시 개체 인스턴스를 ASP 페이지에서 생성해서 사용해야 한다.
(2) 메서드
- FSO를 사용하면 새로운 txt파일이나 폴더를, CreateTextFile이나 CreateFolder를 사용하여 만들 수가 있다.
- 만들어진 파일 및 폴더를 삭제하려면, DeleteFile메서드와 DeleteFolder메서드 또는, File개체와 Folder개체의 Delete 메소드를 사용해 삭제할 수 있다.
- 기존 드라이브, 파일, 폴더에 액세스하려면, "GET"메서드를 사용해 가능하다. ex. GetDrive, GetFolder, GetFile
2. FileSystemObject(FSO) - 드라이브 다루기
ex. 루트 드라이브(C:)의 잔여용량을 보여주는 예제
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set Cdrive = fs.GetDrive("c:")
%>
<HTML>
<head>
<meta charset = "UTF-8">
</head>
<BODY>
<br><center><font face="돋움" size="2">
<h2>FileSystemObject Ex1</h2><br>
C드라이브의 남은 공간 : <%=Cdrive.freespace%> bytes
</font></center>
</BODY>
</HTML
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
// CreateObject를 통해 객체의 인스턴스를 만들어 사용함. (fs라는 이름으로 모든 메소드를 사용할 수 있음)
Set Cdrive = fs.GetDrive("c:")
// C드라이브의 핸들을 얻어오기 위해, GetDrive메소드를 사용함.
// 이후, Cdrive라는 이름으로, 해당 드라이브의 여러 정보를 얻어올 수 있게 됨.
* 핸들(Handle) : 그래픽 사용자 인터페이스(GUI)를 제공하고 있는 컴퓨터 환경에서, 파일 / 윈도우 / 대화상자 등과 같은 자원을 접근하기 위해 사용되는 숫자. 이 숫자는 이름 혹은 자원의 ID를 의미하며, 핸들을 얻어옴으로써 그 자원을 제어할 수 있다.
%>
<% =Cdrive.freespace %>
// Drive객체의 속성인 freespace를 통해 드라이브의 잔여용량을 체크했다.
[ Drive 개체의 속성 ]
AvailableSpace | 지정한 드라이브나 네트워크 공유에서 사용할 수 있는 디스크 공간의 크기를 반환 |
DriveLetter | 실제의 로컬 드라이브나 네트워크 공유의 드라이브 문자를 반환 |
FileSystem | 드라이브에서 사용하는 파일 시스템의 형식을 반환(FAT, NTFS 및 CDFS) |
FreeSpace | 지정한 드라이브나 네트워크 공유에서 사용할 수 있는 빈 공간 크기를 반환 |
IsReady | 지정한 드라이브가 준비되었으면 True를, 그렇지 않으면 False를 반환 |
Path | 지정한 파일, 폴더 또는 드라이브의 경로를 반환 |
RootFolder | 지정한 드라이브의 루트 폴더를 나타내는 Folder 개체를 반환 |
SerialNumber | 디스크 볼륨을 고유하게 식별하는 데 사용하는 십진 일련 번호를 반환 |
ShareName | 지정한 드라이브의 네트워크 공유 이름을 반환 |
TotalSize | 드라이브나 네트워크 공유의 전체 공간을 바이트 단위로 반환 |
VolumeName | 지정한 드라이브의 볼륨 이름을 지정하거나 반환 |
3. FileSystemObject(FSO) - 파일 다루기
ex. 지정한 파일의 객체를 얻어온 후, 그 파일의 여러가지 정보를 가져오는 과정
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set myfile = fs.GetFile("c:\다운로드.jpg") // 내 C드라이브에 있는 파일 기입
%>
<HTML>
<head>
<meta charset = "UTF-8">
</head>
<BODY>
<br><center><font face="돋움" size="2">
<h2>FileSystemObject 예제</h2>
Config.sys 화일의 정보<p>
file size : <%=myfile.size%> bytes<br>
file type : <%=myfile.type%><br>
file path : <%=myfile.path%>
</font></center>
</BODY>
</HTML>
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
// CreateObject를 통해 객체의 인스턴스를 만들어 사용함. (fs라는 이름으로 모든 메소드를 사용할 수 있음)
Set myfile = fs.GetFile("c:\다운로드.jpg")
// Getfile메소드를 통해, 지정된 파일의 핸들을 가져오고 있다.
// Getfile메소드 내에는 파일의 물리적인 경로를 확실하게 기입해줘야 한다. 만일 존재하지 않는 파일을 기입했다면, 에러 메시지를 만나게 된다.
%>
[ File 개체의 속성]
Size | 파일의 사이즈를 얻어옵니다. |
Type | 파일의 타입을 얻어옵니다. |
Path | 파일의 경로를 반환한다 |
ShortName | 파일의 이름를 8.3규칙으로 반환한다 |
ShortPath | 파일의 경로를 8.3규칙으로 반환한다 |
ParentFolder | 파일의 상위 폴더를 얻어옵니다. |
Name | 파일의 이름을 얻어옵니다 |
Drive | 파일이 위치하는 드라이브명을 얻어옵니다 |
DateCreated | 파일이 만들어진 날짜와 시간을 얻어옵니다 |
DateLastAccessed | 파일이 마지막으로 억세스된 날짜,시간을 반환 |
DateLastModified | 파일이 마지막으로 수정된 날짜,시간을 반환 |
4. FileSystemObject(FSO) - 파일 생성
- CreateTextFile 메소드 : 하드상 어떤 폴더에라도, txt파일 (html파일 / asp파일)을 만들 수 있다.
* 그러나, 바이너리 파일은 만들 수 없다.
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
fs.CreateTextFile "c:\MyTest\test.txt",true
// C드라이브에 MyTest폴더가 존재해야 함.
%>
<HTML>
<head>
<meta charset = "UTF-8">
</head>
<BODY>
<br><center><font face="돋움" size="2">
<h2>FSO 텍스트화일 만들기</h2>
<%
if fs.FileExists("c:\MyTest\test.txt") then
Response.write "결과 : test.txt화일이 만들어 졌습니다."
else
Response.write "결과 : test.txt화일이 만들어지지 못했습니다."
end if
%>
</font></center>
</BODY>
</HTML>
FSO의 CreateTextFile메소드를 이용해 서버 폴더에 txt파일을 만들거나 삭제할 경우, 가장 먼저 설정해줘야 할 작업이 있다.
- 파일을 생성, 삭제, 편집하고자 할 경우, 그렇게 파일을 다룰 해당 티렉토리의 파일을, 새로 생성, 쓰기 할 수 있는 권한을 주어야 한다는 것이다.
- 해당 디렉토리에 파일 생성 및 쓰기 권한을 가지고 있지 않다면, 기본적으로 에러를 만나게 됨.
fs.CreateTextFile "c:\MyTest\test.txt",true
// 첫 번째 인자 : 어느 경로에 어떤 이름의 텍스트 파일을 만들 것인지, 전체 경로를 기입한다.
// 두 번째 인자 : 같은 이름의 파일이 이미 존재할 경우, 그를 덮어쓸지 덮어쓰지 못하게 할 것인지를 지정한다.
* true : 덮어쓰기 가능 / false : 덮어쓰기 불가능 ( 생략시 자동 true 설정 )
// 세 번째 인자 : 파일이 만들어질 때 유니코드로 만들어지게 할 것인가, ASCII파일로 생성되게 할 것인가를 결정한다.
* true면 유니코드로, false면 ASCII코드로 생성 (생략시 ASCII로 생성된다)
5. FileSystemObject(FSO) - 파일 쓰기
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = fs.OpenTextFile("c:\MyTest\test.txt",8)
%>
<HTML>
<head>
<meta charset = "UTF-8">
</head>
<BODY>
<br><center><font face="돋움" size="2">
<h2>FSO 텍스트화일에 쓰기</h2>
<%
objFile.writeLine("이것은 글쓰기 테스트입니다.")
objFile.writeLine("이 글은 두번째 라인에 쓰여집니다.")
objFile.writeLine("이 글은 세번째 라인에 쓰여집니다.")
objFile.close
%>
글쓰기 완료!!
</font></center></BODY>
</HTML>
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
// CreateObject를 통해, FileSystemObject 객체의 인스턴스를 만들어 사용함
// fs라는 이름으로 모든 메소드를 사용 가능
Set objFile = fs.OpenTextFile("c:\MyTest\test.txt",8)
// OpenTextFile 메소드 : 파일을 열고 그 파일을 액세스 하는 기능을 가짐
* cf. CreateTextFile 메소드 : 파일을 생성하고 그 파일을 액세스하는 기능을 가짐.
// 이 메소드로 특정 파일을 읽어들이면, 이 파일에 대한 TextStream 객체를 생성하게 된다. 긜고 그 객체를 가지고 지정한 파일을 제어할 수 있다.
// 즉, OpenTextFile메서드를 사용하게 되면, 그 리턴값으로 지정한 파일(test.txt)의 TextStream 객체를 생성하게 되고, 이것을 objFile이라는 이름에 저장하게 된 것.
%>
.
.
.
<%
objFile.writeLine("이것은 글쓰기 테스트입니다.") // objFile에 글쓰기 가능. (WriteLine : 글쓰기 + Enter)
objFile.writeLine("이 글은 두번째 라인에 쓰여집니다.")
objFile.writeLine("이 글은 세번째 라인에 쓰여집니다.")
objFile.close // 파일의 작업이 끝났다면, close메소드를 통해 무조건 닫아줘야 함. (서버가 파일을 계속 오픈하고 있다면 다른 사용자가 그 파일을 접근하지 못할 수 있기 때문)
%>
OpenTextFile ( a , [ b ], [ c ], [ d ] )
* a는 필수이고, 나머지는 선택적으로 기입한다.
a. 파일의 전체 경로
b. 파일 열때 읽기전용 | 쓰기전용 | 읽고쓰기 가능
- 읽기전용 : ForReading(1) * 디폴트값
- 쓰기전용 : ForWriting (2)
- 읽고쓰기 가능 : ForAppending (8)
c. 지정된 파일이 존재하지 않을 경우, 파일을 새롭게 만들것인가
- true : 파일이 없을 경우, 새로운 파일을 만들면서 Open하기를 원하는 경우 * 디폴트 값
- false : 반드시 파일이 있어야만, Open이 가능하다. ( 파일이 기존에 없다면 오류 발생 )
d. 파일의 포멧을 저장하는 인자
-1 : 유니코드 포맷
0 : ASCII 포맷
-2 : System의 디폴트 format
6. FileSystemObject(FSO) - 파일 읽기
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = fs.OpenTextFile("c:\MyTest\test.txt",1)
%>
<HTML>
<head>
<meta charset="UTF-8">
</head>
<BODY>
<br><center><font face="돋움" size="2">
<h2>FSO 텍스트화일 읽기</h2>
<%
Do While objFile.AtEndOfStream <> True
Response.write objFile.readLine & "<br>"
loop
' 이런 방법도 같은 결과를 출력한다.(ReadAll 사용)
' content = objFile.readall
' str = replace(content,chr(13)&chr(10),"<br>")
' Response.write str
%>
</font></center></BODY>
</HTML>
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
// CreateObject를 통해, FileSystemObject 객체의 인스턴스를 만들어 사용함
// fs라는 이름으로 모든 메소드를 사용 가능
Set objFile = fs.OpenTextFile("c:\MyTest\test.txt",1) // OpenTextFile 메소드의 두번째 인자가 읽기전용(1)로 세팅됨
// OpenTextFile 메소드 : 파일을 열고 그 파일을 액세스 하는 기능을 가짐
* cf. CreateTextFile 메소드 : 파일을 생성하고 그 파일을 액세스하는 기능을 가짐.
%>
.
.
.
<%
Do While objFile.AtEndOfStream <> True
// AtEndOfStream, AtEndOfLine, Read 메소드 등은, 읽고쓰기(ForAppending - 8)로 설정하면 오류를 발생시킴. 읽기전용(ForReading - 1)에서만 동작 가능.
// AtEndOfStream : TextStream속성 중 하나.
- 현재 위치가 파일의 끝인지를 나타내주는 속성.
- 파일의 끝에 다다르면 True / 끝이 아니면 False를 리턴함.
// 즉 파일이 끝이 다다를 때까지, 반복문 진행
Response.write objFile.readLine & "<br>"
// Readline : 파일에서 데이터를 라인 단위로 가져와라.
loop
' 이런 방법도 같은 결과를 출력한다.(ReadAll 사용)
' content = objFile.readall // 한 번에 모든 텍스트를 불러오기
' str = replace(content,chr(13)&chr(10),"<br>") //chr(13), chr(10)는 엔터키 => 즉 전체 텍스트 중 이들을 <br>로 바꿔라
' Response.write str
%>
속성 | 설명 |
write(문자열) | 파일에 문자열을 입력 |
WriteLine(문자열) | 파일에 문자열과 엔터값(라인문자)을 입력 |
WriteBlankLines(i) | 파일에 i 개의 엔터값(라인문자)을 입력 |
Read(i) | 파일에서 i 개의 문자만을 읽어온다 |
ReadLine | 파일에서 한 라인을 읽어온다 |
ReadAll | 파일에서 모든 텍스트를 읽어온다 |
Skip(i) | 파일에서 i 개 만큼 문자를 건너뛴다 |
SkipLine | 파일에서 읽어올 때 라인하나를 건너뛴다 |
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |