VB.NET 2008/VB - 파일 액세스

FTP - FTP를 사용하여 해당 경로에 있는 파일목록 확인하기

본클라쓰 2011. 12. 24. 10:21

FtpWebReuest 개체와 FtpWebResponse 개체를 사용하면 FTP를 사용하여 해당 경로에 있는 파일 목록을 확인할 수 있다.

 

위 개체와 비슷한 개체로 WebClient 개체가 있지만 WebClient를 사용하면 해당 URL에 접근해 리소스와 데이터를 주고 받는 일반적인 메서드만 제공할 뿐 FTP 서버에 맞게 명령어를 구성하여 접근할 수 있는 방법을 제공하지 않는다. 즉, WebClient 개체는 간단하게 URL 리소스에 접근하여 작업할 수 있는 개체일 뿐이다.

 

 

네임스페이스 및 어셈블리 : System.Net / System.dll

 

 

 

WebRequest의 구현 개체들

- FileWebRequest

- FtpWebRequest

- HttpWebRequest

 

 

WebResponse의 구현 개체들

- FileWebResponse

- FtpWebResponse

- HttpWebResponse

 

 

 

WebRequest 개체와 WebResponse 개체는 추상 개체이기 때문에 직접 new 연산자를 사용하여 개체를 생성할 수 없고, Create 메서드를 사용하여 생성한다. 또한 사용에도 요청 메서드와 헤더 등을 지정해야 하기 때문에 다소 복잡해질 수 있다.

 

따라서 FTP 서버에 접속해 데이터를 읽고 얻기 위해서 구현된 FtpWebRequest 개체와 FtpWebResponse 개체를 사용하는 것이 FTP 프로토콜에 더욱 적합하다.

 

 

 

FtpWebReeust 개체를 생성하는 방법

 

imports System.Net

 

Dim uri As New Uri("ftp:///localhost/")

Dim request As FtpWebRequest = WebRequest.Create(uri)

 

' 계정 정보를 입력한다.

request.Credentials = New NetworkCredential("ID", "PW")

' 요청 메서드를 지정한다.

request.Method = WebRequestMethods.Ftp.ListDirectoryDetails

' 요청 대기 시간을 지정한다.

requst.Timeout = 1000

' KeepAlive 값을 False로 지정한다.

request.keepAlive = False

 

 

FTP 서버에 접속할 계정 정보를 NetworkCredential 개체를 사용하여 Credentials 속성에 지정한다. 요청 메소드는 WebRequestMethods 개체를 사용하여 지정하며, 요청 대기 시간을 지정한다.

 

요청 대기 시간이 길 경우 해당 FTP 서버에 네트워크 장애나 서버 장애가 발생했을 때 클라이언트의 응용 프로그램의 응답 대기 시간이 길 수 있기 때문에 적당한 시간을 부여한다.

 

KeepAlive 값은 FTP 서버에 대한 제어 연결을 요청 완료한 후 연결이 닫히는 여부를 지정하는 값이다. 서버에 대한 연결이 소멸되지 않아야 한다면 True를 지정하고, 소멸되어야 한다면 False로 지정한다. 기본값은 True이다. 만약, KeepAlive 값이 True이면 모든 작업을 끝내고 response.close() 메서드를 호출해도 세션이 계속해서 연결되어 있다.

 

 

이제 해당 요청에 대응하는 응답 개체를 생성한다.

 

Dim response As FtpWebResponse = request.GetResponse()

 

 

응답 개체를 통해 얻을 수 있는 정보들은 다음과 같다.

 

Console.WriteLine("콘텐츠의 길이 : " & response.ContentLength)

Console.WriteLine("배너 메시지 : " & response.BannerMessage)

Console.WriteLine("FTP 서버 응답 : " & response.StatusDescription)

Console.WriteLine("인증 완료 메시지 : " & response.WelcomeMessage)

Console.WriteLine("종료 메시지 : " & response.ExitMessage)

 

 

ContentLength 속성은 FTP 서버로부터 받은 데이터의 바이트 수를 포함하는 Int64 값이다. FTP 서버에서 응답 스트림이 반환될 때 스트림의 바이트 수가 포함된다. 응답으로 반환된 데이터가 없거나 서버가 콘텐츠 길이 정보를 보내지 않을 경우 ContentLength가 -1을 반환한다.

 

또한, 데이터가 반환되거나 반환되어야 할 경우 반환 값은 0보다 크거나 같다. 예를 들어 ListDirectory 필드를 사용하는 요청인 경우 ContentLength 속성은 항상 -1을 반환한다. Uploadfile 메서드를 사용하는 요청의 경우 0, DownloadFile 메서드를 사용하는 요청의 경우 다운로드한 파일에 데이터가 있으면 0보다 크고, 파일이 비어 있으면 0이다. GetFileSize 메서드를 사용하는 요청의 경우 지정된 파일의 크기를 반환한다.

 

응답 개체를 통해 스트림을 얻어 문자열을 출력하는 방법은 다음과 같다.

 

Dim rs As New System.IO.SteamReader(response.GetResponseStream())

 

Whiel rs.Peek() > -1

    Console.WriteLine(rs.ReadLine())

End While

 

 

StreamReader 개체는 특정 인코딩의 바이트 스트림에서 문자를 읽는 TextReader를 구현했다. StreamReader 개체의 Peek() 메서드를 사용할 수 있는 다음 문자를 반환하지만 사용하지는 않는다. 즉 스트림에서 문자가 있는지를 검색한다. 반환되는 값은 읽은 문자를 나타내는 정수이거나, 읽을 문자가 없거나 스트림에서 검색을 지원하지 않는 경우 -1이다. 따라서 사용자는 반환된 값을 Char 형식으로 캐스팅하기 전에 먼저 이 값이 -1 인지 확인할 수 있다.

 

StreamReader 개체의 ReadLine() 메서드는 현재 스트림에서 한 줄의 문자를 읽고 데이터를 문자열로 반환한다. 입력 스트림의 다음 줄을 반환하거나 입력 스트림의 끝에 도달한 경우 Null을 반환한다.

 

줄은 다음 캐리지 리턴(\r)이 오거나, 줄 바꿈(\n)이 오거나 캐리지 리턴 바로 다음 줄 바꿈(\r\n)이 오는 문자의 시퀀스로 정의된다. 문자열에는 종료 캐리지 리턴 또는 줄 바꿈이 포함되지 않는다. 입력 스트림의 끝에 도달하면 Null 값을 반환한다.

 

그리고 응답 개체의 close 메서드를 호출하면 FTP 서버에 해당 경로 파일 리스트를 가져오는 것으로 종료된다.