My Name is Kay....

DIY , 먹방 , 개발 , 육아 , 여행 좋아합니다. AdBlock 사용시 화면이 정상적으로 노출되지 않습니다.



kay
조회 수 3611 추천 수 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 VS IIS에서 .Net 날짜 형식 YYYY-MM-DD file kay 2015.08.24 290
34 C# 웹 사이트 모니터링 프로그램 C# file kay 2015.08.18 1289
33 C# C# SMTP 서버를 이용한 메일 발송 1 kay 2015.07.30 440
32 VS .net Release / Debug 콤보박스 안보일때 file kay 2015.05.08 319
31 C# C# 엑셀데이터 읽어서 디비에 저장 file kay 2014.10.14 2766
30 C# C# 소수점 지정 kay 2014.10.14 1259
» C# C# FTP 이용시 유용한 클래스 kay 2014.09.29 3611
28 C# appSettings 값 추가하기 , 읽어오기 , 값 존재 유무 체크 kay 2013.12.23 4730
27 C# 스레드에서 함수 호출시 매개변수 넘기기 kay 2013.10.29 2664
26 C# multiLine TextBox 자동 스크롤시키기 kay 2013.10.29 2905
25 VB 파일 읽기 , 복사 , 삭제 , 쓰기 , 파일 유무 kay 2013.09.27 3042
24 C# 엑셀 내보내기 , Exporting SQL To Excel kay 2013.09.05 3646
23 C# [담아온글] For vs Foreach Performance 속도 대결 1 kay 2013.09.04 11085
22 C# DataGridView ComboBox editingcontrolshowing 이벤트 걸기 kay 2013.09.04 3257
21 C# 문자열 검색 " String.Contains() " kay 2013.09.04 2792
20 C# DataGridViewComboBoxColumn Change 이벤트 Value 값 가져오기 kay 2013.09.02 3647
19 C# 화면 캡쳐하기 kay 2013.09.02 3308
18 C# 엑셀 내보내기 , Exporting DataGridview To Excel kay 2013.08.08 4436
17 C# C# 외부 프로그램 실행하기 ( Process.Start ) kay 2013.08.06 8653
16 C# TextBox KeyEvent 엔터 이벤트 실행하기 kay 2013.07.26 3044
Board Pagination Prev 1 2 Next
/ 2