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("\n");
                    line = reader.ReadLine();
                }
                result.Remove(result.ToString().LastIndexOf("\n"), 1);
                reader.Close();
                response.Close();
                return result.ToString().Split('\n');
            }
            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("\n");
                            }
                        }
                    }
                    else
                    {
                        result.Append(line);
                        result.Append("\n");
                    }
                    line = reader.ReadLine();
                }
                string val = result.ToString();
                if (!string.IsNullOrEmpty(val))
                    result.Remove(val.LastIndexOf('\n'), 1);
                reader.Close();
                response.Close();
                val = result.ToString();
                if (!string.IsNullOrEmpty(val))
                    return result.ToString().Split('\n');
                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() + "\n";
                }
                else if (str.Trim().Substring(0, 1).ToUpper() == "D")
                {
                    /*判斷 Unix 風格*/
                    string dir = str.Substring(54).Trim();
                    if (dir != "." && dir != "..")
                    {
                        m += dir + "\n";
                    }
                }
            }

            char[] n = new char[] { '\n' };
            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);
            }
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM