잊지 않겠습니다.

FTP Client

.NET Framework 2009. 1. 7. 13:05

가장 긴 Regular expression을 적고 만듯한 소스... 좀 고칠 방법을 찾아야지 될듯. 

 FTP Client Source

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;

namespace SYNCmailDatabaseAPI.FTP
{
    public class FTPClient
    {
        public string Host { get; set; }
        public string RemotePath { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public int Port { get; set; }
        public string FTPStatusDescription { get; private set; }

        public FTPClient()
        {
            Port = 21;
            UserName = "anonymous";
            Password = "anonymous@hostway.co.kr";
        }

        public bool  MakeDirectory(string subDirectory)
        {
            try
            {
                FtpWebRequest ftpRequest = BuildFtpWebRequest(subDirectory);
                ftpRequest.Method = WebRequestMethods.Ftp.MakeDirectory;

                FtpWebResponse ftpResponse = ( FtpWebResponse )ftpRequest.GetResponse();
                FTPStatusDescription = ftpResponse.StatusDescription;
                ftpResponse.Close();

                return true;
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.InnerException);
                return false;
            }
        }

        public bool UploadFile(string remoteFileName, byte[] btDatas)
        {
            FtpWebRequest ftpRequest = BuildFtpWebRequest(remoteFileName);
            ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
            
            try
            {
                FtpWebResponse ftpResponse = (FtpWebResponse) ftpRequest.GetResponse();
                using(Stream st = ftpRequest.GetRequestStream())
                {
                    Console.WriteLine(btDatas.Length);
                    Console.WriteLine(btDatas);
                    st.Write(btDatas, 0, btDatas.Length);
                }
                FTPStatusDescription = ftpResponse.StatusDescription;
                ftpResponse.Close();
            }
            catch(Exception ex)
            {
                Console.WriteLine("Ex : " + ex.Message);
                Console.WriteLine(ex.InnerException);
                return false;
            }
            return true;
        }

        public FTPItem[] GetFileList(string rootDirectory)
        {
            FtpWebRequest ftpRequest = BuildFtpWebRequest(rootDirectory);
            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            FtpWebResponse response = (FtpWebResponse) ftpRequest.GetResponse();
            
            byte[] btDatas = new byte[4086];
            int offset = 0;
            int readCount = 0;
            using(Stream st = response.GetResponseStream())
            {
                while( (readCount = st.Read(btDatas, offset, 20)) > 0 )
                {
                    offset += readCount;    
                }
            }

            string convertedString = Encoding.Default.GetString(btDatas, 0, offset);
            string[] filesInDirectory = convertedString.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries);

            List<FTPItem> ftpObjects = new List<FTPItem>();
            foreach(string file in filesInDirectory)
            {
                Console.WriteLine("{0} / {1}", file, file.Length);

                FTPItem ftpObject = new FTPItem(file);
                ftpObjects.Add(ftpObject);
            }
            return ftpObjects.ToArray();
        }

        private FtpWebRequest BuildFtpWebRequest(string subUri)
        {
            string ftpUri = "ftp://" + Host + "/" + subUri;
            Console.WriteLine(ftpUri);
            FtpWebRequest ftpRequest = (FtpWebRequest) FtpWebRequest.Create(ftpUri);
            ftpRequest.Credentials = new NetworkCredential(UserName, Password);
            ftpRequest.UseBinary = true;

            return ftpRequest;
        }
    }
}

 

 FTPItem

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace SYNCmailDatabaseAPI.FTP
{
    public class FTPItem
    {
        public string Name { get; private set; }
        public int Size { get; private set; }
        public bool IsDirectory { get; private set; }
        public DateTime LastUpdateDate { get; private set; }

        private static DateTime ConvertDateTime(string ftpMessage)
        {
            int year = int.Parse(ftpMessage.Substring(6, 2));
            int month = int.Parse(ftpMessage.Substring(0, 2));
            int day = int.Parse(ftpMessage.Substring(3, 2));
            
            int hour = int.Parse(ftpMessage.Substring(10, 2));
            int minute = int.Parse(ftpMessage.Substring(13, 2));

            bool isAM = ftpMessage.Contains("AM");
            if(!isAM)
            {
                hour = hour + 12;
            }

            Console.WriteLine("Year : {0}, Month : {1}, Day {2}, Hour : {3}, Minute {4}", year, month, day, hour, minute);

            return new DateTime(year, month, day, hour, minute, 0);
        }

        public FTPItem(string ftpResponseString)
        {
            //04-14-08  02:22PM       <DIR>          App_Data 
            //03-29-08  06:07AM                  112 Global.asax 
            Regex regx = new Regex(@"\A(?<date>[0-9]{2}\-[0-9]{2}\-[0-9]{2}\s\s[0-9]{2}\:[0-9]{2}(AM|PM))\s*((?<filesize>[0-9]+)|(?<dir>\<DIR\>\s*))\s(?<name>(\w|\W)*)\Z");
            
            Match match = regx.Match(ftpResponseString);
            string dateString = match.Groups[ "date" ].Value;
 
            LastUpdateDate = ConvertDateTime(dateString);
            IsDirectory = match.Groups[ "dir" ].Success;
            if ( !IsDirectory )
            {
                Size = int.Parse(match.Groups[ "filesize" ].Value);
            }
            else
            {
                Size = 0;
            }
            Name = match.Groups[ "name" ].Value;
        }
    }
}

Posted by Y2K
,