zoukankan      html  css  js  c++  java
  • C# FTP上传

     public class FtpHelper
        {
            public FtpHelper(string p_url, string p_user, string p_password)
            {
                if (!p_url.ToUpper().StartsWith("FTP:"))
                {
                    Url = "ftp://" + p_url;
                }
                else
                {
                    Url = p_url;
                }
                User = p_user;
                Password = p_password;
            }
    
            public string Url { get; private set; }
    
            public string User { get; private set; }
    
            public string Password { get; private set; }
    
            public FtpWebRequest CreateConnect(string p_uri)
            {
                FtpWebRequest reqFTP;
    
                // 根据uri创建FtpWebRequest对象 
                reqFTP = (FtpWebRequest)WebRequest.Create(new Uri(p_uri));
    
                // ftp用户名和密码
                reqFTP.Credentials = new NetworkCredential(User, Password);
    
                return reqFTP;
            }
    
            /// <summary>
            /// 上传文件
            /// </summary>
            /// <param name="p_uri">ftp地址 ex=ftp://192.168.100.5//tmp// 切记要以//结尾</param>
            /// <param name="p_filename">文件路径地址绝对路径 ex:C:\Usersligl\Desktop\1.txt</param>
            /// <param name="isDelete"></param>
            /// <returns></returns>
            public bool Upload(string p_uri, string p_filename, bool isDelete = false)
            {
                var fileInf = new FileInfo(p_filename);
                string uri = Path.Combine(p_uri, fileInf.Name);
    
                FtpWebRequest reqFTP = CreateConnect(uri);
                // 默认为true,连接不会被关闭
                // 在一个命令之后被执行
                reqFTP.KeepAlive = false;
    
                // 指定执行什么命令
                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
    
                // 指定数据传输类型
                reqFTP.UseBinary = true;
    
                // 上传文件时通知服务器文件的大小
                reqFTP.ContentLength = fileInf.Length + 20;
    
                // 缓冲大小设置为2kb
                int buffLength = 2048;
    
                var buff = new byte[buffLength];
                int contentLen;
    
                // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
                FileStream fs = fileInf.OpenRead();
                try
                {
                    // 把上传的文件写入流
                    Stream strm = reqFTP.GetRequestStream();
    
                    // 每次读文件流的2kb
                    contentLen = fs.Read(buff, 0, buffLength);
    
                    // 流内容没有结束
                    while (contentLen != 0)
                    {
                        // 把内容从file stream 写入 upload stream
                        strm.Write(buff, 0, contentLen);
    
                        contentLen = fs.Read(buff, 0, buffLength);
                    }
    
                    // 关闭两个流
                    strm.Close();
                    fs.Close();
    
                    var uploadResponse = (FtpWebResponse)reqFTP.GetResponse();
                    if (File.Exists(p_filename) && isDelete)
                    {
                        File.Delete(p_filename);
                    }
                    return (uploadResponse.StatusDescription.StartsWith("226"));
                }
                catch (Exception ex)
                {
                    //System.Windows.MessageBox.Show(ex.Message, "Upload Error");
                    throw ex;
                }
            }
    
            public bool Delete(string p_filename)
            {
                var fileInf = new FileInfo(p_filename);
                string uri = Path.Combine(Url, fileInf.Name);
    
                try
                {
                    var listRequest = (FtpWebRequest)WebRequest.Create(new Uri(uri));
    
                    listRequest.Method = WebRequestMethods.Ftp.DeleteFile;
    
                    listRequest.Credentials = new NetworkCredential(User, Password);
    
                    var listResponse = (FtpWebResponse)listRequest.GetResponse();
    
                    return (listResponse.StatusDescription.StartsWith("250"));
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            public bool MakeDir(string p_uri)
            {
                try
                {
                    string url = Url;
                    if (string.IsNullOrEmpty(url))
                    {
                        return false;
                    }
    
                    char lastChar = url[url.Length - 1];
                    if (lastChar != '\' && lastChar != '/')
                    {
                        url += '\';
                    }
    
                    string dir = p_uri.Remove(0, url.Length);
    
                    string[] dirs = dir.Split(new[] { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar },
                                              StringSplitOptions.RemoveEmptyEntries);
    
                    dir = CreateDir(dirs);
    
                    return CreateMackDir(url, dir);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    
            public string CreateDir(string[] p_dirNames)
            {
                var sb = new StringBuilder();
    
                foreach (string dir in p_dirNames)
                {
                    sb.Append(dir);
                    sb.Append("\");
                }
    
                return sb.ToString();
            }
    
            public string GetFirstDir(string p_dir)
            {
                string[] dirs = p_dir.Split(new[] { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar },
                                            StringSplitOptions.RemoveEmptyEntries);
    
                if (dirs.Length > 0)
                {
                    return dirs[0];
                }
    
                return string.Empty;
            }
    
            public string RemvoeDirFromFirst(string p_longDir, string p_firstDir)
            {
                string value = p_longDir.Remove(0, p_firstDir.Length + 1);
    
                return value;
            }
    
            private bool CreateMackDir(string p_url, string p_dir)
            {
                string dir = GetFirstDir(p_dir);
    
                if (string.IsNullOrEmpty(dir))
                {
                    return true;
                }
    
                string newurl = Path.Combine(p_url, dir);
                if (!IsExsit(p_url, dir))
                {
                    try
                    {
                        FtpWebRequest reqFtp = CreateConnect(newurl);
                        reqFtp.Method = WebRequestMethods.Ftp.MakeDirectory;
                        var response = (FtpWebResponse)reqFtp.GetResponse();
                        response.Close();
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
    
                string newdir = RemvoeDirFromFirst(p_dir, dir);
                CreateMackDir(newurl, newdir);
    
                return true;
            }
    
            public bool IsExsit(string p_url, string p_dir)
            {
                string[] list = GetFileList(p_url, WebRequestMethods.Ftp.ListDirectory);
    
                if (list == null || list.Length == 0)
                {
                    return false;
                }
    
                return list.Contains(p_dir);
            }
    
            private string[] GetFileList(string path, string WRMethods) //上面的代码示例了如何从ftp服务器上获得文件列表
            {
                var result = new StringBuilder();
    
                try
                {
                    string tempPath = path;
                    if (!path.EndsWith("/"))
                    {
                        tempPath += "/";
                    }
    
                    FtpWebRequest reqFtp = CreateConnect(tempPath);
                    reqFtp.Method = WRMethods;
                    WebResponse response = reqFtp.GetResponse();
                    var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); //中文文件名
                    string line = reader.ReadLine();
                    while (line != null)
                    {
                        result.Append(line);
                        result.Append("
    ");
                        line = reader.ReadLine();
                    }
                    // to remove the trailing '/n'
                    if (result.Length > 0)
                    {
                        result.Remove(result.ToString().LastIndexOf('
    '), 1);
                    }
                    reader.Close();
                    response.Close();
                    return result.ToString().Split('
    ');
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
  • 相关阅读:
    flashdevelop生成swc库(转)
    SOG and COG spec
    [C]switch...case...一个case包含多个值的一种写法
    [C]赋值语句返回值
    Antenna知识整理
    SPI接口比IIC速度快的理解
    C语言代码的换行
    SRRC认证
    蓝牙协议分析(6)_BLE地址类型
    结构体变量和指针对成员的引用形式
  • 原文地址:https://www.cnblogs.com/ligl/p/5718590.html
Copyright © 2011-2022 走看看