FTP上传文件到服务器

一、初始化上传控件。

1、我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/

2、这里我们使用一个div元素作为dropzone载体。

<div class="tray-bin ml10 mr10" style="min-height: 250px;">
    <h5 class="text-muted mt10 fw600">
        <i class="fa fa-exclamation-circle text-info fa-lg"></i> 上传外部文件
    </h5>
    <div class="dropzone dropzone-sm" id="dropZone">
        <div class="fallback">
            <input name="file" type="file" multiple />
        </div>
    </div>
</div>

3、这里我们使用Dropzone 附带的 jQuery 插件创建dropzone,(示例仅作参考,如果想实现自己想要的功能还需要参照官方给出的文档进行修改)。

function InitDropzone() {
    //Dropzone的初始化,dropZone为div的id
    $("#dropZone").dropzone({
        //指明了文件提交到哪个页面。
        url: "/Job/Exercise/Upload",
        //相当于<input>元素的name属性,默认为file。
        paramName: "file",
        //最大文件大小,单位是 MB。
        maxFilesize: 1024,
        //默认为null,可以指定为一个数值,限制最多文件数量。
        maxFiles: 1,
        //默认false。如果设为true,则会给文件添加一个删除链接
        addRemoveLinks: true,
        //指明允许上传的文件类型,格式是逗号分隔的 MIME type 或者扩展名。例如:image/*,application/pdf,.psd,.obj
        acceptedFiles: ".sdb,.srk",
        //指明是否允许 Dropzone 一次提交多个文件。默认为false。如果设为true,则相当于 HTML 表单添加multiple属性。
        uploadMultiple: false,
        //如果设定,则会作为额外的 header 信息发送到服务器。例如:{"custom-header": "value"}
        //headers:{"custom-header": "value"},
        //关闭自动上传功能,默认会true会自动上传,也就是添加一张图片向服务器发送一次请求
        autoProcessQueue: true,
        //没有任何文件被添加的时候的提示文本
        dictDefaultMessage: '<i class="fa fa-cloud-upload"></i> 
                 <span class="main-text"><b>点击选择题库文件</b></span> <br /> 
                 <span class="sub-text">或将文件拖动到这里,单次最多上传1个文件</span> 
                ',
        //文件类型被拒绝时的提示文本
        dictInvalidInputType: "",
        //文件大小过大时的提示文本。
        dictFileTooBig: "文件过大({{filesize}}MB). 上传文件最大支持: {{maxFilesize}}MB.",
        //取消上传链接的文本
        dictCancelUpload: "取消上传",
        //取消上传确认信息的文本。
        dictCancelUploadConfirmation: "你确定要取消上传吗?",
        //移除文件链接的文本。
        dictRemoveFile: "移除文件",
        //超过最大文件数量的提示文本。
        dictMaxFilesExceeded: "您一次最多只能上传{{maxFiles}}个文件",
        //如果该文件与文件类型不匹配所示的错误消息
        dictInvalidFileType: "请上传题库文件",
        //如果服务器响应无效时的错误消息。{{statusCode}}将被替换的服务器状态代码
        dictResponseError: '文件上传失败!',
        //一个函数,在 Dropzone 初始化的时候调用,可以用来添加自己的事件监听器。
        init: function () {
            //当一个文件被添加到列表中
            this.on("addedfile", function (file) {

            });
            //从列表中删除一个文件。你可以监听该事件然后从您的服务器删除文件
            this.on("removedfile", function (file) {
                if (file.fileName == undefined) { return; }

                var url = "/Job/Exercise/DeleteFile";
                window.setTimeout(function () {
                    var postData = {
                        fileName: file.fileName
                    }
                    AjaxJson(url, postData, function (data) {
                        //alertDialog(data.Message, 1);
                    });
                }, 500);
            });
            //当文件的数量达到maxFiles限制时调用
            this.on("maxfilesreached", function (file) {

            });
            //由于文件数量达到 maxFiles 限制数量被拒绝时调用
            this.on("maxfilesexceeded", function (file) {
                this.removeFile(file);
            });
            //当上传队列中的所有文件上传完成时调用
            this.on("queuecomplete", function (file) {

            });
            //文件已经成功上传触发。file为第一个参数,获取服务器响应作为第二个参数。(这一事件在finished之前触发。
            this.on("success", function (file, response) {
                file.fileName = response.FileName;

                if (response.Result) {
                    $("#FileName").val(response.FileName);
                    $("#FilePath").val(response.FilePath);
                    $("#FileSize").val(response.FileSize);
                } else {
                    alertDialog(response.Message, -1);
                    this.removeFile(file);
                }
            });
            //发生一个错误。接收errorMessage作为第二个参数,如果错误是由于XMLHttpRequest xhr对象为第三个参数。
            this.on("error", function (file, errorMessage) {
                alertDialog(errorMessage, -1);
                this.removeFile(file);
            });
            //上传成功或错误时。
            this.on("complete", function (file) {

            });
        },
    });
}

二、后台上传功能。

1、保存文件到服务器,并上传到FTP服务器。

/// <summary>
/// 上传文件
/// </summary>
/// <returns></returns>
public JsonResult Upload()
{
    #region 局部变量
    var result = true;
    var checkResult = false;

    string message = string.Empty;
    string ftpMessage = string.Empty;
    string savePath = string.Empty;
    string fileName = string.Empty;
    string fileSize = string.Empty;
    string filePath = string.Empty;
    var currentDir = string.Empty;

    List<string> dirList = new List<string>();

    FtpWeb ftpWeb = null;
    HttpPostedFileBase file = null;
    var topicdb = new T_zy_topicdb();
    var topicdbftp = new T_zy_topicdbftp();
    #endregion

    try
    {
        #region 判断是否为有效文件
        file = Request.Files[0];
        if (file.ContentLength <= 0)
        {
            result = false;
            message = "不能上传零字节的文件";
            return Json(new { Result = result, Message = message });
        }
        #endregion

        #region 保存文件
        //上传文件临时路径
        savePath = SysFun.GetAppUploadPath() + SysFun.GetTopicDBSavePath();
        if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath);
        fileName = Path.GetFileName(file.FileName);
        fileSize = SysFun.FileSize(file.ContentLength);
        filePath = string.Format("{0}\{1}", savePath, fileName);
        //保存文件
        file.SaveAs(filePath);
        #endregion

        #region 上传到FTP目录
        topicdbftp = bllTopicDBFTP.SelectWhere("1=1");
        checkResult = FtpWebTest.CheckFtp(topicdbftp.IP, topicdbftp.UserName, topicdbftp.Password, topicdbftp.Port, topicdbftp.Pattern.Value, topicdbftp.Anonymous.Value, out ftpMessage);
        if (checkResult)
        {
            ftpWeb = new FtpWeb(topicdbftp.IP, SysFun.GetUploadDir(), topicdbftp.UserName, topicdbftp.Password, topicdbftp.Port, 3000, topicdbftp.Pattern.Value, topicdbftp.Anonymous.Value);
            dirList = SysFun.GetTopicDBSavePath().Split(new string[] { "\" }, StringSplitOptions.RemoveEmptyEntries).ToList();
            foreach (var dirName in dirList)
            {
                if (!ftpWeb.DirectoryExist(dirName)) ftpWeb.MakeDir(dirName);
                currentDir = string.Format("/{0}/", dirName);
                ftpWeb.GotoDirectory(currentDir, false);
            }
            ftpWeb.Upload(filePath);
            result = true;
            message = "上传成功!";
        }
        else
        {
            result = false;
            message = "FTP上传失败,原因:" + ftpMessage;
            DeleteLocalEnvFile(filePath, ftpWeb);
        }
        #endregion
    }
    catch (Exception ex)
    {
        result = false;
        message = ex.Message;
        DeleteLocalEnvFile(filePath, ftpWeb);
    }

    return Json(new { Result = result, Message = message, FileName = fileName, FileSize = fileSize, FilePath = filePath });
}

2、以下是上传文件用到的帮助类。

/// <summary>
/// 计算文件大小函数(保留两位小数),Size为字节大小
/// </summary>
/// <param name="Size">初始文件大小</param>
/// <returns></returns>
public static string FileSize(long Size)
{
    string m_strSize = "";
    long FactSize = 0;
    FactSize = Size;
    if (FactSize < 1024.00)
        m_strSize = FactSize.ToString("F2") + " Byte";
    else if (FactSize >= 1024.00 && FactSize < 1048576)
        m_strSize = (FactSize / 1024.00).ToString("F2") + " K";
    else if (FactSize >= 1048576 && FactSize < 1073741824)
        m_strSize = (FactSize / 1024.00 / 1024.00).ToString("F2") + " M";
    else if (FactSize >= 1073741824)
        m_strSize = (FactSize / 1024.00 / 1024.00 / 1024.00).ToString("F2") + " G";
    return m_strSize;
}
public class FtpWebTest
{
    static Dictionary<string, string> StatusList;

    /// <summary>
    /// 检查FTP连接(带地址)
    /// </summary>
    /// <param name="ftpUserID">用户名</param>
    /// <param name="ftpPassword">密码</param>
    /// <param name="port">端口号</param>
    /// <param name="pattern">模式</param>
    /// <param name="ftpAnonymous">匿名</param>
    /// <param name="message">返回信息</param>
    /// <returns></returns>
    public static bool CheckFtp(string ftpUserID, string ftpPassword, string port, bool pattern, bool ftpAnonymous, out string message)
    {
        return CheckFtp("", ftpUserID, ftpPassword, port, pattern, ftpAnonymous, out message);
    }
    /// <summary>
    /// 检查FTP连接(不带地址)
    /// </summary>
    /// <param name="ip">地址</param>
    /// <param name="ftpUserID">用户名</param>
    /// <param name="ftpPassword">密码</param>
    /// <param name="port">端口号</param>
    /// <param name="pattern">模式</param>
    /// <param name="ftpAnonymous">匿名</param>
    /// <param name="message">返回信息</param>
    /// <returns></returns>
    public static bool CheckFtp(string ip, string ftpUserID, string ftpPassword, string port, bool pattern, bool ftpAnonymous, out string message)
    {
        int statusCode = 0;
        bool checkResult = false;
        string serverIP = string.Empty;
        string ftpURL = string.Empty;
        FtpWebRequest ftpRequest = null;
        FtpWebResponse ftpResponse = null;

        try
        {
            if (string.IsNullOrEmpty(ip)) serverIP = GetIPAddress(); else serverIP = ip;
            if (string.IsNullOrEmpty(serverIP)) throw new Exception("获取服务器IP地址失败");
            ftpURL = string.Format("ftp://{0}:{1}/", serverIP, port);
            ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURL));
            if (!ftpAnonymous)
            {
                ftpRequest.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            }
            ftpRequest.UsePassive = pattern;
            ftpRequest.UseBinary = true;
            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
            ftpRequest.Timeout = 3000;
            ftpResponse = ftpRequest.GetResponse() as FtpWebResponse;
            if (ftpResponse.StatusCode == FtpStatusCode.OpeningData || ftpResponse.StatusCode == FtpStatusCode.DataAlreadyOpen)
            {
                checkResult = true;
            }
            statusCode = (int)ftpResponse.StatusCode;
            message = GetStatusMessage(statusCode.ToString());
            ftpResponse.Close();
        }
        catch (WebException ex)
        {
            checkResult = false;
            message = ex.Message;
        }
        catch (Exception ex)
        {
            checkResult = false;
            message = ex.Message;
        }

        return checkResult;
    }
    private static string GetStatusMessage(string statusCode)
    {
        GetStatusName();

        if (StatusList.ContainsKey(statusCode))
        {
            return StatusList[statusCode];
        }
        else
        {
            return "检测失败";
        }
    }
    private static void GetStatusName()
    {
        StatusList = new Dictionary<string, string>();
        StatusList.Add("110", "响应包含一个重新启动标记回复");
        StatusList.Add("120", "此服务现在不可用,请稍后再试您的请求");
        StatusList.Add("125", "数据连接已打开并且请求的传输已开始");
        StatusList.Add("150", "服务器正在打开数据连接");
        StatusList.Add("200", "命令成功完成");
        StatusList.Add("202", "服务器未执行该命令");
        StatusList.Add("220", "服务器已能进行用户登录操作");
        StatusList.Add("221", "服务器正在关闭管理连接");
        StatusList.Add("226", "服务器正在关闭数据连接,并且请求的文件操作成功");
        StatusList.Add("250", "请求的文件操作成功完成");
        StatusList.Add("331", "服务器需要提供密码");
        StatusList.Add("332", "服务器需要提供登录帐户");
        StatusList.Add("421", "此服务不可用");
        StatusList.Add("425", "无法打开数据连接");
        StatusList.Add("426", "连接已关闭");
        StatusList.Add("451", "发生了阻止完成请求操作的错误");
        StatusList.Add("452", "不能执行请求的操作,因为服务器上没有足够的空间");
        StatusList.Add("500", "命令具有语法错误或不是服务器可识别的命令");
        StatusList.Add("501", "一个或多个命令参数具有语法错误");
        StatusList.Add("502", "FTP 服务器未执行该命令");
        StatusList.Add("530", "登录信息必须发送到服务器");
        StatusList.Add("532", "需要服务器上的用户帐户");
        StatusList.Add("550", "无法对指定文件执行请求的操作,原因是该文件不可用");
        StatusList.Add("551", "不能采取请求的操作,因为指定的页类型是未知的");
        StatusList.Add("552", "不能执行请求的操作");
        StatusList.Add("553", "无法对指定文件执行请求的操作");
    }
    private static string GetIPAddress()
    {
        IPAddress[] arrIPAddresses = Dns.GetHostAddresses(Dns.GetHostName());
        foreach (IPAddress ip in arrIPAddresses)
        {
            if (ip.AddressFamily.Equals(AddressFamily.InterNetwork))
            {
                return ip.ToString();
            }
        }
        return "";
    }
}
public class FtpWeb
    {
        string ftpServerIP;
        string ftpRemotePath;
        string ftpUserID;
        string ftpPassword;
        string ftpURI;
        string ftpPort;
        int timeOut;
        bool model;
        bool anonymous;
        /// <summary> 
        /// 连接FTP 
        /// </summary> 
        /// <param name="FtpServerIP">FTP连接地址</param> 
        /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param> 
        /// <param name="FtpUserID">用户名</param> 
        /// <param name="FtpPassword">密码</param> 
        public FtpWeb(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword, string FtpPort, int TimeOut, bool Model, bool Anonymous)
        {
            ftpServerIP = FtpServerIP;
            ftpRemotePath = FtpRemotePath;
            ftpUserID = FtpUserID;
            ftpPassword = FtpPassword;
            ftpPort = FtpPort;
            timeOut = TimeOut;
            model = Model;
            anonymous = Anonymous;
            ftpURI = string.Format("ftp://{0}:{1}/{2}/", ftpServerIP, FtpPort, ftpRemotePath);
        }
        public FtpWeb(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword, string FtpPort)
        {
            ftpServerIP = FtpServerIP;
            ftpRemotePath = FtpRemotePath;
            ftpUserID = FtpUserID;
            ftpPassword = FtpPassword;
            ftpPort = FtpPort;
            timeOut = 10000;
            model = true;
            anonymous = true;
            ftpURI = string.Format("ftp://{0}:{1}/{2}/", ftpServerIP, FtpPort, ftpRemotePath);
            //ftpURI = string.Format("ftp://{0}:{1}/", ftpServerIP, FtpPort);
        }
        /// <summary> 
        /// 上传 
        /// </summary> 
        /// <param name="filename"></param> 
        public void Upload(string filename)
        {
            FileInfo fileInf = new FileInfo(filename);
            string uri = ftpURI + fileInf.Name;
            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            if (!anonymous)
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.KeepAlive = false;
            reqFTP.Timeout = timeOut;
            reqFTP.UsePassive = model;
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.UseBinary = true;
            reqFTP.ContentLength = fileInf.Length;
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            FileStream fs = fileInf.OpenRead();
            try
            {
                Stream strm = reqFTP.GetRequestStream();
                contentLen = fs.Read(buff, 0, buffLength);
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                strm.Close();
                fs.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FTP上传文件过程中发生错误:" + ex.Message);
            }
        }
        public void Download(string TopicDBCode, string filePath, string fileName)
        {
            Download(TopicDBCode, filePath, fileName, "");
        }
        /// <summary> 
        /// 下载 
        /// </summary> 
        /// <param name="filePath"></param> 
        /// <param name="fileName"></param> 
        public void Download(string TopicDBCode, string filePath, string fileName, string Uri)
        {
            FtpWebRequest reqFTP;
            string FileName = "";
            FtpWebResponse response = null;
            Stream ftpStream = null;
            FileStream outputStream = null;
            try
            {
                FileName = filePath + Path.DirectorySeparatorChar + fileName;
                if (!Directory.Exists(filePath))
                    Directory.CreateDirectory(filePath);
                outputStream = new FileStream(FileName, FileMode.Create);
                string Url = ftpURI;
                if (!string.IsNullOrEmpty(Uri))
                    Url += Uri;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(Url + fileName));
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                reqFTP.UseBinary = true;
                reqFTP.Timeout = timeOut;
                reqFTP.UsePassive = model;
                if (!anonymous)
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                response = (FtpWebResponse)reqFTP.GetResponse();
                ftpStream = response.GetResponseStream();
                long cl = response.ContentLength;
                int bufferSize = 2048;
                int readCount;
                byte[] buffer = new byte[bufferSize];
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                ftpStream.Close();
                outputStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                if (ftpStream != null)
                    ftpStream.Close();
                if (outputStream != null)
                    outputStream.Close();
                if (response != null)
                    response.Close();
                if (File.Exists(FileName))
                    File.Delete(FileName);
                throw new Exception("FTP下载文件过程中发生错误:" + ex.Message);
            }
        }


        /// <summary> 
        /// 删除文件 
        /// </summary> 
        /// <param name="fileName"></param> 
        public void Delete(string fileName)
        {
            try
            {
                string uri = ftpURI + fileName;
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                reqFTP.Timeout = timeOut;
                reqFTP.UsePassive = model;
                if (!anonymous)
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.KeepAlive = false;
                reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
                string result = String.Empty;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                long size = response.ContentLength;
                Stream datastream = response.GetResponseStream();
                StreamReader sr = new StreamReader(datastream);
                result = sr.ReadToEnd();
                sr.Close();
                datastream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FTP删除文件过程中发生错误:" + ex.Message);
            }
        }

        /// <summary> 
        /// 删除文件夹 
        /// </summary> 
        /// <param name="folderName"></param> 
        public void RemoveDirectory(string folderName)
        {
            try
            {
                string uri = ftpURI + folderName;
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                reqFTP.Timeout = timeOut;
                reqFTP.UsePassive = model;
                if (!anonymous)
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.KeepAlive = false;
                reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;



                string result = String.Empty;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                long size = response.ContentLength;
                Stream datastream = response.GetResponseStream();
                StreamReader sr = new StreamReader(datastream);
                result = sr.ReadToEnd();
                sr.Close();
                datastream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FTP删除文件夹过程中发生错误:" + ex.Message);
            }
        }

        /// <summary> 
        /// 获取当前目录下明细(包含文件和文件夹) 
        /// </summary> 
        /// <returns></returns> 
        public string[] GetFilesDetailList()
        {
            try
            {
                StringBuilder result = new StringBuilder();
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
                if (!anonymous)
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
                reqFTP.Timeout = timeOut;
                reqFTP.UsePassive = model;
                WebResponse response = reqFTP.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
                string line = reader.ReadLine();
                while (line != null)
                {
                    result.Append(line);
                    result.Append("
");
                    line = reader.ReadLine();
                }
                result.Remove(result.ToString().LastIndexOf("
"), 1);
                reader.Close();
                response.Close();
                return result.ToString().Split('
');
            }
            catch (Exception ex)
            {
                throw new Exception("FTP获取目录过程中发生错误:" + ex.Message);
            }
        }

        public string[] GetFileList(string mask)
        {
            return GetFileList("", mask);
        }
        public string[] GetFileList(string TopicDBCode, string mask)
        {
            return GetFileList(TopicDBCode, mask, "");
        }
        /// <summary>
        /// 获取当前目录下文件列表(仅文件) 
        /// </summary>
        /// <param name="TopicDBCode"></param>
        /// <param name="mask"></param>
        /// <param name="Uri">文件夹/</param>
        /// <returns></returns>
        public string[] GetFileList(string TopicDBCode, string mask, string Uri)
        {
            string[] downloadFiles;
            StringBuilder result = new StringBuilder();
            FtpWebRequest reqFTP;
            try
            {
                if (!string.IsNullOrEmpty(Uri))
                {
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + Uri));
                }
                else
                {
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
                }
                reqFTP.Timeout = timeOut;
                reqFTP.UsePassive = model;
                reqFTP.UseBinary = true;
                if (!anonymous)
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
                WebResponse response = reqFTP.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
                string line = reader.ReadLine();
                while (line != null)
                {
                    if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
                    {
                        int length = mask.IndexOf("*");
                        if (length < line.Length)
                        {
                            string mask_ = mask.Substring(0, length);
                            if (line.Substring(0, mask_.Length) == mask_)
                            {
                                result.Append(line);
                                result.Append("
");
                            }
                        }
                    }
                    else
                    {
                        result.Append(line);
                        result.Append("
");
                    }
                    line = reader.ReadLine();
                }
                string val = result.ToString();
                if (!string.IsNullOrEmpty(val))
                    result.Remove(val.LastIndexOf('
'), 1);
                reader.Close();
                response.Close();
                val = result.ToString();
                if (!string.IsNullOrEmpty(val))
                    return result.ToString().Split('
');
                else return null;
            }
            catch (Exception ex)
            {
                downloadFiles = null;
                if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
                {
                    throw new Exception("FTP获取目录失败:" + ex.Message);
                }
                return downloadFiles;
            }
        }

        /// <summary> 
        /// 获取当前目录下所有的文件夹列表(仅文件夹) 
        /// </summary> 
        /// <returns></returns> 
        public string[] GetDirectoryList()
        {
            string[] drectory = GetFilesDetailList();
            string m = string.Empty;
            foreach (string str in drectory)
            {
                int dirPos = str.IndexOf("<DIR>");
                if (dirPos > 0)
                {
                    /*判断 Windows 风格*/
                    m += str.Substring(dirPos + 5).Trim() + "
";
                }
                else if (str.Trim().Substring(0, 1).ToUpper() == "D")
                {
                    /*判断 Unix 风格*/
                    string dir = str.Substring(54).Trim();
                    if (dir != "." && dir != "..")
                    {
                        m += dir + "
";
                    }
                }
            }

            char[] n = new char[] { '
' };
            return m.Split(n);
        }

        /// <summary> 
        /// 判断当前目录下指定的子目录是否存在 
        /// </summary> 
        /// <param name="RemoteDirectoryName">指定的目录名</param> 
        public bool DirectoryExist(string RemoteDirectoryName)
        {
            string[] dirList = GetDirectoryList();
            foreach (string str in dirList)
            {
                if (str.Trim() == RemoteDirectoryName.Trim())
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary> 
        /// 判断当前目录下指定的文件是否存在 
        /// </summary> 
        /// <param name="RemoteFileName">远程文件名</param> 
        public bool FileExist(string RemoteFileName)
        {
            string[] fileList = GetFileList("*.*");
            if (fileList == null)
            {
                return false;
            }

            foreach (string str in fileList)
            {
                if (str.Trim() == RemoteFileName.Trim())
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary> 
        /// 创建文件夹 
        /// </summary> 
        /// <param name="dirName"></param> 
        public void MakeDir(string dirName)
        {
            FtpWebRequest reqFTP;
            try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName));
                reqFTP.Timeout = timeOut;
                reqFTP.UsePassive = model;
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.UseBinary = true;
                if (!anonymous)
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();

                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FTP创建文件夹过程中发生错误:" + ex.Message);
            }
        }

        /// <summary> 
        /// 获取指定文件大小 
        /// </summary> 
        /// <param name="filename"></param> 
        /// <returns></returns> 
        public long GetFileSize(string filename)
        {
            FtpWebRequest reqFTP;
            long fileSize = 0;
            try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));
                reqFTP.Timeout = timeOut;
                reqFTP.UsePassive = model;
                reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
                reqFTP.UseBinary = true;
                if (!anonymous)
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                fileSize = response.ContentLength;

                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FTP获取文件大小失败:" + ex.Message);
            }
            return fileSize;
        }

        /// <summary> 
        /// 改名 
        /// </summary> 
        /// <param name="currentFilename"></param> 
        /// <param name="newFilename"></param> 
        public void ReName(string currentFilename, string newFilename)
        {
            FtpWebRequest reqFTP;
            try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));
                reqFTP.Timeout = timeOut;
                reqFTP.UsePassive = model;
                reqFTP.Method = WebRequestMethods.Ftp.Rename;
                reqFTP.RenameTo = newFilename;
                reqFTP.UseBinary = true;
                if (!anonymous)
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();

                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FTP文件改名失败:" + ex.Message);
            }
        }

        /// <summary> 
        /// 移动文件 
        /// </summary> 
        /// <param name="currentFilename"></param> 
        /// <param name="newFilename"></param> 
        public void MovieFile(string currentFilename, string newDirectory)
        {
            ReName(currentFilename, newDirectory);
        }

        /// <summary> 
        /// 切换当前目录 
        /// </summary> 
        /// <param name="DirectoryName"></param> 
        /// <param name="IsRoot">true 绝对路径   false 相对路径</param> 
        public void GotoDirectory(string DirectoryName, bool IsRoot)
        {
            if (IsRoot)
            {
                ftpRemotePath = DirectoryName;
            }
            else
            {
                ftpRemotePath += DirectoryName + "/";
            }
            ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
        }

        /// <summary> 
        /// 删除目录 
        /// </summary> 
        /// <param name="ftpServerIP">FTP 主机地址</param> 
        /// <param name="folderToDelete">FTP 用户名</param> 
        /// <param name="ftpUserID">FTP 用户名</param> 
        /// <param name="ftpPassword">FTP 密码</param> 
        public static void DeleteOrderDirectory(string ftpServerIP, string folderToDelete, string ftpUserID, string ftpPassword, string FtpPort)
        {
            try
            {
                if (!string.IsNullOrEmpty(ftpServerIP) && !string.IsNullOrEmpty(folderToDelete) && !string.IsNullOrEmpty(ftpUserID) && !string.IsNullOrEmpty(ftpPassword))
                {
                    FtpWeb fw = new FtpWeb(ftpServerIP, folderToDelete, ftpUserID, ftpPassword, FtpPort);
                    //进入订单目录 
                    fw.GotoDirectory(folderToDelete, true);
                    //获取规格目录 
                    string[] folders = fw.GetDirectoryList();
                    foreach (string folder in folders)
                    {
                        if (!string.IsNullOrEmpty(folder) || folder != "")
                        {
                            //进入订单目录 
                            string subFolder = folderToDelete + "/" + folder;
                            fw.GotoDirectory(subFolder, true);
                            //获取文件列表 
                            string[] files = fw.GetFileList("*.*");
                            if (files != null)
                            {
                                //删除文件 
                                foreach (string file in files)
                                {
                                    fw.Delete(file);
                                }
                            }
                            //删除冲印规格文件夹 
                            fw.GotoDirectory(folderToDelete, true);
                            fw.RemoveDirectory(folder);
                        }
                    }

                    //删除订单文件夹 
                    string parentFolder = folderToDelete.Remove(folderToDelete.LastIndexOf('/'));
                    string orderFolder = folderToDelete.Substring(folderToDelete.LastIndexOf('/') + 1);
                    fw.GotoDirectory(parentFolder, true);
                    fw.RemoveDirectory(orderFolder);
                }
                else
                {
                    throw new Exception("FTP路径不能为空!");
                }
            }
            catch (Exception ex)
            {
                throw new Exception("FTP删除目录时发生错误,错误信息为:" + ex.Message);
            }
        }
    }
作者:灬花儿灬
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/flower1990/p/5586750.html