开发者

C# - Connecting to a FTP Server [closed]

开发者 https://www.devze.com 2023-02-03 01:49 出处:网络
Closed. This question needs to be more focused. It is not currently accepting answers. 开发者_开发技巧
Closed. This question needs to be more focused. It is not currently accepting answers. 开发者_开发技巧

Want to improve this question? Update the question so it focuses on one problem only by editing this post.

Closed 8 years ago.

Improve this question

I want to build a small FTP client with FTPWebRequest, I just would like some help for connecting and grabbing header information to show the user from there I think I can figure out the rest of the application.


Nice article how to build a simple FTP Client in .NET you may find here http://aspalliance.com/1187_Building_a_Simple_FTP_Application_Using_C_20.all

Also i may give you some advice, for example you want to check if file is available on the FTP server, in that case you may just check its size.

Here is the function which responsible for that:

        public bool IsFtpFileExists(string remoteUri, out long remFileSize)
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(BuildServerUri(remoteUri));
            FtpWebResponse response;

            request.Method = WebRequestMethods.Ftp.GetFileSize;
            request.Credentials = new NetworkCredential(Username, Password);
            try
            {
                response = (FtpWebResponse)request.GetResponse();
                remFileSize = response.ContentLength;
                return true;
            }
            catch (WebException we)
            {
                response = we.Response as FtpWebResponse;
                if (response != null && response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
                {
                    remFileSize = 0;
                    return false;
                }
                throw;
            }
        }


Here is a sample to get directory information. The method GetDirectoryInformation is at the bottom of the code sample. This should cover Windows and Unix based Ftp. There is also a more complete FTP Client code sample here.

class Ftp
    {

        public struct FileStruct
        {
            public string Flags;
            public string Owner;
            public string Group;
            public bool IsDirectory;
            public DateTime CreateTime;
            public string Name;
        }

        public enum FileListStyle
        {
            UnixStyle,
            WindowsStyle,
            Unknown
        }

        private List<FileStruct> GetList(string datastring)
        {
            List<FileStruct> myListArray = new List<FileStruct>();
            string[] dataRecords = datastring.Split('\n');
            FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);
            foreach (string s in dataRecords)
            {
                if (_directoryListStyle != FileListStyle.Unknown && s != "")
                {
                    FileStruct f = new FileStruct();
                    f.Name = "..";
                    switch (_directoryListStyle)
                    {
                        case FileListStyle.UnixStyle:
                            f = ParseFileStructFromUnixStyleRecord(s);
                            break;
                        case FileListStyle.WindowsStyle:
                            f = ParseFileStructFromWindowsStyleRecord(s);
                            break;
                    }
                    if (!(f.Name == "." || f.Name == ".."))
                    {
                        myListArray.Add(f);
                    }
                }
            }

            return myListArray; ;
        }

        private FileStruct ParseFileStructFromWindowsStyleRecord(string Record)
        {
            ///Assuming the record style as 
            /// 02-03-11  07:46PM       <DIR>          Append
            FileStruct f = new FileStruct();
            string processstr = Record.Trim();
            string dateStr = processstr.Substring(0, 8);
            processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();
            string timeStr = processstr.Substring(0, 7);
            processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();
            f.CreateTime = DateTime.Parse(dateStr + " " + timeStr);
            if (processstr.Substring(0, 5) == "<DIR>")
            {
                f.IsDirectory = true;
                processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();
            }
            else
            {
                string[] strs = processstr.Split(new char[] { ' ' });
                processstr = strs[1].Trim();
                f.IsDirectory = false;
            }
            f.Name = processstr;  //Rest is name   
            return f;
        }


        public FileListStyle GuessFileListStyle(string[] recordList)
        {
            foreach (string s in recordList)
            {
                if (s.Length > 10 && Regex.IsMatch(s.Substring(0, 10), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))
                {
                    return FileListStyle.UnixStyle;
                }

                if (s.Length > 8 && Regex.IsMatch(s.Substring(0, 8), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))
                {
                    return FileListStyle.WindowsStyle;
                }
            }
            return FileListStyle.Unknown;
        }

        private FileStruct ParseFileStructFromUnixStyleRecord(string record)
        {
            ///Assuming record style as
            /// dr-xr-xr-x   1 owner    group               0 Feb 25  2011 bussys
            FileStruct f = new FileStruct();
            string processstr = record.Trim();

            f.Flags = processstr.Substring(0, 9);
            f.IsDirectory = (f.Flags[0] == 'd');

            processstr = (processstr.Substring(11)).Trim();

            _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);   //skip one part

            f.Owner = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
            f.Group = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);

            _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);   //skip one part

            DateTime createTime = DateTime.Now;

            var dateString = _cutSubstringFromStringWithTrim(ref processstr, ' ', 8);
            DateTime.TryParse(dateString, out createTime);

            f.CreateTime = createTime;
            f.Name = processstr;   //Rest of the part is name
            return f;
        }

        private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex)
        {
            int pos1 = s.IndexOf(c, startIndex);
            string retString = s.Substring(0, pos1);

            s = (s.Substring(pos1)).Trim();

            return retString;
        }

        public List<FileStruct> GetDirectoryInformation(string ftpUri, NetworkCredential networkCredential)
        {
            List<FileStruct> directoryInfo = new List<FileStruct>();
            try
            {
                FtpWebRequest ftpClientRequest = WebRequest.Create(ftpUri) as FtpWebRequest;
                ftpClientRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                ftpClientRequest.Proxy = null;
                ftpClientRequest.Credentials = networkCredential;

                FtpWebResponse response = ftpClientRequest.GetResponse() as FtpWebResponse;
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.ASCII);
                string datastring = sr.ReadToEnd();
                response.Close();

                directoryInfo = GetList(datastring);

                return directoryInfo;
            }
            catch (Exception e)
            {
                return directoryInfo;
            }
        }
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消