Home Full Site
C#에서 FTP 사용하기

C#에서 FTP 다운로드, 업로드 등의 클라이언트 기능을 사용하기 위해서는 흔히 (1) FtpWebRequest / FtpWebResponse 혹은 (2) WebClient 를 사용한다. WebClient는 사용 방법이 더 간단하지만, 고급 기능을 지원하지 않는 단점이 있다. 반면 FtpWebRequest / FtpWebResponse는 보다 정교한 핸들링이 가능하고 고급 기능을 모두 사용할 수 있다. FtpWebRequest / FtpWebResponse는 WebRequest / WebResponse 모델의 FTP용 파생클래스들이며, 사용 방법은 WebRequest / WebResponse 모델을 그대로 따른다.



C#에서 FTP 파일 다운로드

FTP 서버에서 파일을 다운로드 받기 위해서 FtpWebRequest / FtpWebResponse를 사용하는 방법을 알아보자. 우선 FtpWebRequest 객체를 생성하기 위해서는 WebRequest.Create(ftpPath) 메서드를 사용하는데, 이 Create() 메서드의 파라미터로 ftp:// 패스를 지정하면 된다.
(WebRequest.Create는 http, https, ftp, file 등의 여러 프로토콜을 지원하는데, 전달되는 파라미터에 맞는 Request 객체를 리턴한다. 예를 들어, http:// 의 경우 HttpWebRequest, ftp:// 의 경우 FtpWebRequest)

FtpWebRequest 객체가 생성된 후에 기본적으로 다운로드할지, 업로드할지, 리스팅할지 등을 결정하기 위해 FtpWebRequest.Method 속성을 지정하게 되고, 또한 FTP 사용자를 지정하는 FtpWebRequest.Credentials 속성을 설정하게 된다. FTP 사용자 설정은 FTP 서버에 엑세스하기 위한 FTP 로그인명과 암호를 지정하는데, 만약 FTP 서버가 익명(anonymous) 로그인을 지원하는 경우 로그인명에 anonymous를 지정하면 된다.

이렇게 FtpWebRequest 객체가 모두 준비된 후에는 GetResponse()를 호출하여 FTP 서버를 호출하여 결과를 기다리게 된다 (GetResponse는 Synchronous 방식이고 파일이 큰 경우 Asynchronous 메서드인 BeginGetResponse 를 사용할 수도 있다). GetResponse()로부터 FtpWebResponse를 얻은 후 .GetResponseStream()를 사용하면 결과 스트림을 얻을 수 있고, 이를 텍스트 파일 혹은 바이너리 파일로 저장하면 된다.

아래 예제는 ftp.microsoft.com 사이트의 한 파일을 익명 로그인을 사용하여 다운로드하고 이를 텍스트 파일로 로컬에 저장하는 코드이다.


예제

public void FtpDownload()
{
    // 코드 단순화를 위해 하드코드함
    string ftpPath = "ftp://ftp.microsoft.com/softlib/index.txt";
    string user = "anonymous";  // FTP 익명 로그인시. 아니면 로그인/암호 지정.
    string pwd = "";
    string outputFile = "index.txt";

    // WebRequest.Create로 Http,Ftp,File Request 객체를 모두 생성할 수 있다.
    FtpWebRequest req = (FtpWebRequest)WebRequest.Create(ftpPath);
    // FTP 다운로드한다는 것을 표시
    req.Method = WebRequestMethods.Ftp.DownloadFile;
    // 익명 로그인이 아닌 경우 로그인/암호를 제공해야
    req.Credentials = new NetworkCredential(user, pwd);

    // FTP Request 결과를 가져온다.
    using (FtpWebResponse resp = (FtpWebResponse)req.GetResponse())
    {
        // FTP 결과 스트림
        Stream stream = resp.GetResponseStream();

        // 결과를 문자열로 읽기 (바이너리로 읽을 수도 있다)
        string data;
        using (StreamReader reader = new StreamReader(stream))
        {
            data = reader.ReadToEnd();
        }

        // 로컬 파일로 출력
        File.WriteAllText(outputFile, data);                
    }            
}



C#에서 FTP 파일 업로드

FTP 서버에서 파일을 업로드하는 방법은 FTP 다운로드와 거의 비슷하다. 우선 WebRequest.Create() 메서드를 사용하여 FtpWebRequest 객체를 생성하고, FtpWebRequest.Method 에 UploadFile을 지정한다. FTP 업로드를 하기 위해서는 FTP 서버에 쓰기 권한이 있어야 하므로 쓰기 권한이 있는 로그인명을 지정한다. 그리고 데이타 업로드를 위한 준비 작업으로 RequestStream을 FtpWebRequest.GetRequestStream()로부터 얻은 후, 이 스트림에 데이타를 써 놓는다. 그리고 마지막으로 GetResponse()를 호출하여 업로드를 실행하고 결과 상태를 FtpWebResponse.StatusDescription 혹은 StatusCode 에서 체크하면 된다. 아래 예제는 (가상의) FTP 사이트에 텍스트 파일을 업로드 하는 샘플 코드이다.

예제

public void FtpUpload()
{
    // 코드 단순화를 위해 하드코드함
    string ftpPath = "ftp://ftp.test.com/home/myindex.txt";    
    string user = "ftpuser";  
    string pwd = "ftppwd";
    string inputFile = "index.txt";

    // WebRequest.Create로 Http,Ftp,File Request 객체를 모두 생성할 수 있다.
    FtpWebRequest req = (FtpWebRequest)WebRequest.Create(ftpPath);
    // FTP 업로드한다는 것을 표시
    req.Method = WebRequestMethods.Ftp.UploadFile;
    // 쓰기 권한이 있는 FTP 사용자 로그인 지정
    req.Credentials = new NetworkCredential(user, pwd);

    // 입력파일을 바이트 배열로 읽음
    byte[] data;
    using (StreamReader reader = new StreamReader(inputFile))
    {
        data = Encoding.UTF8.GetBytes(reader.ReadToEnd());
    }

    // RequestStream에 데이타를 쓴다
    req.ContentLength = data.Length;
    using (Stream reqStream = req.GetRequestStream())
    {
        reqStream.Write(data, 0, data.Length);
    }

    // FTP Upload 실행
    using (FtpWebResponse resp = (FtpWebResponse)req.GetResponse())
    {
        // FTP 결과 상태 출력
        Console.WriteLine("Upload: {0}", resp.StatusDescription);
    }
}



WebClient를 이용한 FTP 다운로드

WebClient 클래스를 이용하여 파일을 다운로드하거나 업로드할 수 있다. FTP 다운로드를 위해서는 간단히 WebClient.DownloadFile() 메서드를 사용할 수 있는데, 파라미터로 FTP 서버상의 다운로드 Path와 로컬 출력 파일의 Path를 지정하면 된다. 또한 FTP 업로드를 위해서는 DownloadFile() 대신 UploadFile()을 사용하면 쉽게 구현할 수 있다. 아래 예제는 WebClient를 이용하여 바이너리 DLL 파일을 다운로드하는 샘플코드이다.

예제

public void FtpDownloadUsingWebClient()
{    
    string ftpPath = "ftp://ftp.test.com/home/bin/Home.dll";
    string user = "ftpuser";  // FTP 사용자 로그인
    string pwd = "ftppwd";
    string outputFile = "Home.dll";

    // WebClient 객체 생성
    using (WebClient cli = new WebClient())
    {
        // FTP 사용자 설정
        cli.Credentials = new NetworkCredential(user, pwd);
        
        // FTP 다운로드 실행
        cli.DownloadFile(ftpPath, outputFile);

        // FTP 업로드 실행
        // cli.UploadFile(ftpPath, outputFile);
    }
}



© csharpstudy.com