My Name is Kay....

DIY , 먹방 , 개발 , 육아 , 여행 좋아합니다.
AdBlock 사용시 화면이 정상적으로 노출되지 않습니다.
포스팅 관련 문의 및 개발 문의는 Email : wkzkfmxksi@gmail.com

추가 포스팅이 이뤄지지 않는 블로그입니다. 문의는 wkzkfmxksi@gmail.com 으로 연락주세요.
kay
조회 수 6185 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

C# FTP 이용 관련 Class


원문 http://www.hoons.net/board/qacshap/content/49813


-----------------------------------------코드--------------------------------------------
/// <summary>
/// FTP를 위한 유틸 클래스입니다.
/// </summary>
public class FtpUtil
{
    #region 멤버 변수 & 프로퍼티
 
        /// <summary>
        ///
        /// </summary>
        private string host;
 
        /// <summary>
        /// FTP 서버 호스트명(IP)를 가져옵니다.
        /// </summary>
        public string Host
        {
            get { return host; }
            private set { host = value; }
        }
 
        private string userName;
 
        /// <summary>
        /// 사용자 명을 가져옵니다.
        /// </summary>
        public string UserName
        {
            get { return userName; }
            private set { userName = value; }
        }
 
        private string password;
 
        /// <summary>
        /// 비밀번호를 가져옵니다.
        /// </summary>
        public string Password
        {
            get { return password; }
            private set { password = value; }
        }
 
        #endregion
 
    #region 생성자
 
    /// <summary>
    /// FXFtpUtil의 새 인스턴스를 생성합니다.
    /// </summary>
    /// <param name="host">FTP 서버 주소 입니다.</param>
    /// <param name="userName">FTP 사용자 아이디 입니다.</param>
    /// <param name="password">FTP 비밀번호 입니다.</param>
    public FtpUtil(string host, string userName, string password)
    {
        this.Host = host;
        this.UserName = userName;
        this.Password = password;
    }
 
    #endregion
 
    #region 메서드
 
    /// <summary>
    /// 파일을 FTP 서버에 업로드 합니다.
    /// </summary>
    /// <param name="localFileFullPath">로컬 파일의 전체 경로 입니다.</param>
    /// <param name="ftpFilePath"><para>파일을 업로드 할 FTP 전체 경로 입니다.</para><para>하위 디렉터리에 넣는 경우 /디렉터리명/파일명.확장자 형태 입니다.</para></param>
    /// <exception cref="FileNotFoundException">지정한 로컬 파일(localFileFullPath)이 없을 때 발생합니다.</exception>
    /// <returns>업로드 성공 여부입니다.</returns>
    public bool Upload(string localFileFullPath, string ftpFilePath)
    {
        LocalFileValidationCheck(localFileFullPath);
 
        FTPDirectioryCheck(GetDirectoryPath(ftpFilePath));
        if (IsFTPFileExsit(ftpFilePath))
        {
            throw new ApplicationException(string.Format("{0}은 이미 존재하는 파일 입니다.", ftpFilePath));
        }
        string ftpFileFullPath = string.Format("ftp://{0}/{1}", this.Host, ftpFilePath);
        FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(ftpFileFullPath)) as FtpWebRequest;
        ftpWebRequest.Credentials = GetCredentials();
        ftpWebRequest.UseBinary = true;
        ftpWebRequest.UsePassive = true;
        ftpWebRequest.Timeout = 10000;
        ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
 
        FileInfo fileInfo = new FileInfo(localFileFullPath);
        FileStream fileStream = fileInfo.OpenRead();
        Stream stream = null;
        byte[] buf = new byte[2048];
        int currentOffset = 0;
        try
        {
            stream = ftpWebRequest.GetRequestStream();
            currentOffset = fileStream.Read(buf, 0, 2048);
            while (currentOffset != 0)
            {
                stream.Write(buf, 0, currentOffset);
                currentOffset = fileStream.Read(buf, 0, 2048);
            }
 
        }
        finally
        {
            fileStream.Dispose();
            if (stream != null)
                stream.Dispose();
        }
 
        return true;
    }
 
    /// <summary>
    /// 해당 경로에 파일이 존재하는지 여부를 가져옵니다.
    /// </summary>
    /// <param name="ftpFilePath">파일 경로</param>
    /// <returns>존재시 참 </returns>
    private bool IsFTPFileExsit(string ftpFilePath)
    {
        string fileName = GetFileName(ftpFilePath);
        string ftpFileFullPath = string.Format("ftp://{0}/{1}", this.Host, GetDirectoryPath(ftpFilePath));
        FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(ftpFileFullPath)) as FtpWebRequest;
        ftpWebRequest.Credentials = new NetworkCredential(this.UserName, this.Password);
        ftpWebRequest.UseBinary = true;
        ftpWebRequest.UsePassive = true;
        ftpWebRequest.Timeout = 10000;
        ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        FtpWebResponse response = null;
        string data = string.Empty;
        try
        {
            response = ftpWebRequest.GetResponse() as FtpWebResponse;
            if (response != null)
            {
                StreamReader streamReader = new StreamReader(response.GetResponseStream(), Encoding.Default);
                data = streamReader.ReadToEnd();
            }
        }
        finally
        {
            if (response != null)
            {
                response.Close();
            }
        }
 
        string[] directorys = data.Split(new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
        return (from directory in directorys
                select directory.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries)
                into directoryInfos where directoryInfos[0][0] != 'd' select directoryInfos[8]).Any(
                    name => name == fileName);
    }
 
    /// <summary>
    /// FTP 풀 경로에서 Directory 경로만 가져옵니다.
    /// </summary>
    /// <param name="ftpFilePath">FTP 풀 경로</param>
    /// <returns>디렉터리 경로입니다.</returns>
    private string GetDirectoryPath(string ftpFilePath)
    {
        string[] datas = ftpFilePath.Split(new string[] {"/"}, StringSplitOptions.RemoveEmptyEntries);
        string directoryPath = string.Empty;
 
        for (int i = 0; i < datas.Length - 1; i++)
        {
            directoryPath += string.Format("/{0}", datas[i]);
        }
        return directoryPath;
    }
 
    /// <summary>
    /// FTP 풀 경로에서 파일이름만 가져옵니다.
    /// </summary>
    /// <param name="ftpFilePath">FTP 풀 경로</param>
    /// <returns>파일명입니다.</returns>
    private string GetFileName(string ftpFilePath)
    {
        string[] datas = ftpFilePath.Split(new string[] {"/"}, StringSplitOptions.RemoveEmptyEntries);
        return datas[datas.Length - 1];
    }
 
    /// <summary>
    /// FTP 경로의 디렉토리를 점검하고 없으면 생성
    /// </summary>
    /// <param name="directoryPath">디렉터리 경로 입니다.</param>
    public void FTPDirectioryCheck(string directoryPath)
    {
        string[] directoryPaths = directoryPath.Split(new string[] {"/"}, StringSplitOptions.RemoveEmptyEntries);
 
        string currentDirectory = string.Empty;
        foreach (string directory in directoryPaths)
        {
            currentDirectory += string.Format("/{0}", directory);
            if (!IsExtistDirectory(currentDirectory))
            {
                MakeDirectory(currentDirectory);
            }
        }
    }
 
    /// <summary>
    /// FTP에 해당 디렉터리가 있는지 알아온다.
    /// </summary>
    /// <param name="currentDirectory">디렉터리 명</param>
    /// <returns>있으면 참</returns>
    private bool IsExtistDirectory(string currentDirectory)
    {
        string ftpFileFullPath = string.Format("ftp://{0}{1}", this.Host, GetParentDirectory(currentDirectory));
        FtpWebRequest ftpWebRequest = WebRequest.Create(new Uri(ftpFileFullPath)) as FtpWebRequest;
        ftpWebRequest.Credentials = new NetworkCredential(this.UserName, this.Password);
        ftpWebRequest.UseBinary = true;
        ftpWebRequest.UsePassive = true;
        ftpWebRequest.Timeout = 10000;
        ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
        FtpWebResponse response = null;
        string data = string.Empty;
        try
        {
            response = ftpWebRequest.GetResponse() as FtpWebResponse;
            if (response != null)
            {
                StreamReader streamReader = new StreamReader(response.GetResponseStream(), Encoding.Default);
 
                data = streamReader.ReadToEnd();
            }
        }
        finally
        {
            if (response != null)
            {
                response.Close();
            }
        }
 
        string[] directorys = data.Split(new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
        return (from directory in directorys
                select directory.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries)
                into directoryInfos where directoryInfos[0][0] == 'd' select directoryInfos[8]).Any(
                    name => name == (currentDirectory.Split('/')[currentDirectory.Split('/').Length - 1]).ToString());
    }
 
    /// <summary>
    /// 상위 디렉터리를 알아옵니다.
    /// </summary>
    /// <param name="currentDirectory"></param>
    /// <returns></returns>
    private string GetParentDirectory(string currentDirectory)
    {
        string[] directorys = currentDirectory.Split(new string[] {"/"}, StringSplitOptions.RemoveEmptyEntries);
        string parentDirectory = string.Empty;
        for (int i = 0; i < directorys.Length - 1; i++)
        {
            parentDirectory += "/" + directorys[i];
        }
 
        return parentDirectory;
    }
 
    /// <summary>
    /// 인증을 가져옵니다.
    /// </summary>
    /// <returns>인증</returns>
    private ICredentials GetCredentials()
    {
        return new NetworkCredential(this.UserName, this.Password);
    }
 
    private string GetStringResponse(FtpWebRequest ftp)
    {
        string result = "";
        using (FtpWebResponse response = (FtpWebResponse) ftp.GetResponse())
        {
            long size = response.ContentLength;
            using (Stream datastream = response.GetResponseStream())
            {
                if (datastream != null)
                {
                    using (StreamReader sr = new StreamReader(datastream))
                    {
                        result = sr.ReadToEnd();
                        sr.Close();
                    }
 
                    datastream.Close();
                }
            }
 
            response.Close();
        }
 
        return result;
    }
 
    private FtpWebRequest GetRequest(string URI)
    {
        FtpWebRequest result = (FtpWebRequest) WebRequest.Create(URI);
        result.Credentials = GetCredentials();
        result.KeepAlive = false;
        return result;
    }
 
    /// <summary>
    /// FTP에 해당 디렉터리를 만든다.
    /// </summary>
    /// <param name="dirpath"></param>
    public bool MakeDirectory(string dirpath)
    {
        string URI = string.Format("ftp://{0}/{1}", this.Host, dirpath);
        System.Net.FtpWebRequest ftp = GetRequest(URI);
        ftp.Method = System.Net.WebRequestMethods.Ftp.MakeDirectory;
 
        try
        {
            string str = GetStringResponse(ftp);
        }
        catch
        {
            return false;
        }
        return true;
    }
 
    /// <summary>
    /// 지정한 로컬 파일이 실제 존재하는지 확인합니다.
    /// </summary>
    /// <param name="localFileFullPath">로컬 파일의 전체 경로입니다.</param>
    private void LocalFileValidationCheck(string localFileFullPath)
    {
        if (!File.Exists(localFileFullPath))
        {
            throw new FileNotFoundException(string.Format("지정한 로컬 파일이 없습니다.\n경로 : {0}", localFileFullPath));
        }
    }
 
    #endregion
}
 
?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
35 C# ComboBox Option ( Add , Set , Get ) kay 2013.07.10 16002
34 C# Confirm Massage 창 띄우기 kay 2013.07.22 13001
33 C# [담아온글] For vs Foreach Performance 속도 대결 1 kay 2013.09.04 11800
32 C# C# 외부 프로그램 실행하기 ( Process.Start ) kay 2013.08.06 10548
31 C# TextBox 에서 줄바꿈 넣기 kay 2013.07.22 10389
30 C# DataGridView 에서 Cells 값 Null/Empty 체크하기 kay 2013.07.22 9514
29 C# 폼에서 새폼 열고 자신은 완전히 닫기. kay 2013.07.26 7607
» C# C# FTP 이용시 유용한 클래스 kay 2014.09.29 6185
27 C# dataGridView 내용 정렬 ( DefaultCellStyle , ColumnHeadersDefaultCellStyle ) kay 2013.07.08 5877
26 C# DataGridViewComboBoxColumn Change 이벤트 Value 값 가져오기 kay 2013.09.02 5369
25 C# appSettings 값 추가하기 , 읽어오기 , 값 존재 유무 체크 kay 2013.12.23 5237
24 C# C# 엑셀데이터 읽어서 디비에 저장 file kay 2014.10.14 5127
23 C# 엑셀 내보내기 , Exporting DataGridview To Excel kay 2013.08.08 5117
22 C# DataGridView ComboBox editingcontrolshowing 이벤트 걸기 kay 2013.09.04 4693
21 C# 엑셀 내보내기 , Exporting SQL To Excel kay 2013.09.05 4328
20 C# 화면 캡쳐하기 kay 2013.09.02 4058
19 VB 파일 읽기 , 복사 , 삭제 , 쓰기 , 파일 유무 kay 2013.09.27 3950
18 C# SqlCommand 재사용(Reuse) 하기 kay 2013.07.10 3919
17 C# TextBox KeyEvent 엔터 이벤트 실행하기 kay 2013.07.26 3838
16 C# MDI 폼 이동 및 시작 폼 설정하기 kay 2013.07.09 3429
Board Pagination Prev 1 2 Next
/ 2