幫助類: 配置文件配置: <!--ftp配置,以分號相隔 格式:"主機名;用戶名;密碼;"-->例子:<Item key="FtpConfig" value="192.168.0.1;admin;123456" /> 上傳調用例子: ...
幫助類:
using QSProjectBase; using Reform.CommonLib; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; namespace Reform.CommonLib { /// <summary> /// ftp操作 /// </summary> public class FtpHelper { /// <summary> /// 上傳文件 /// </summary> /// <param name="fileName">上傳文件的全路徑</param> /// <param name="accessory">上傳類</param> /// <returns></returns> public static bool UploadFile(FileInfo fileinfo, string ftpPath) { try { if (fileinfo == null || string.IsNullOrEmpty(ftpPath)) return false; string url = ftpPath; if (url.Contains("/") || url.Contains("\\")) { var str = url.Split(new Char[] { '/', '\\' }); var dic = url.Replace(str[str.Length - 1], ""); CheckAndMakeDir(dic); } System.Net.FtpWebRequest ftp = GetRequest(url); //設置FTP命令 設置所要執行的FTP命令, //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假設此處為顯示指定路徑下的文件列表 ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile; ftp.UseBinary = true; ftp.UsePassive = true; ftp.ContentLength = fileinfo.Length; const int BufferSize = 20480; //緩衝大小設置為20KB byte[] content = new byte[BufferSize - 1 + 1]; int dataRead; using (FileStream fs = fileinfo.OpenRead()) { try { using (Stream rs = ftp.GetRequestStream()) { do { dataRead = fs.Read(content, 0, BufferSize); rs.Write(content, 0, dataRead); } while (!(dataRead < BufferSize)); rs.Close(); } } catch (Exception) { } finally { fs.Close(); } } ftp = null; ////設置FTP命令 //ftp = GetRequest(URI); //ftp.Method = System.Net.WebRequestMethods.Ftp.Rename; //改名 //ftp.RenameTo = fileinfo.Name; //try //{ // ftp.GetResponse(); //} //catch (Exception ex) //{ // ftp = GetRequest(URI); // ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; //刪除 // ftp.GetResponse(); //} //ftp = null; return true; } catch (Exception) { return false; } } /// <summary> /// 上傳文件 /// </summary> /// <param name="fileName">上傳文件的全路徑</param> /// <param name="ftpPath">上傳的目錄(包括文件名)</param> /// <param name="progressHelper">進度幫助</param> /// <returns></returns> public static bool UploadFile(FileInfo fileinfo, string ftpPath, ProgressHelper progressHelper, MessageProgressHandler handler) { try { if (fileinfo == null || string.IsNullOrEmpty(ftpPath)) return false; string url = ftpPath; if (url.Contains("/") || url.Contains("\\")) { var str = url.Split(new Char[] { '/', '\\' }); var dic = url.Replace(str[str.Length - 1], ""); CheckAndMakeDir(dic); } System.Net.FtpWebRequest ftp = GetRequest(url); //設置FTP命令 設置所要執行的FTP命令, //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假設此處為顯示指定路徑下的文件列表 ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile; ftp.UseBinary = true; ftp.UsePassive = false; ftp.ContentLength = fileinfo.Length; const int BufferSize = 20480; //緩衝大小設置為20KB byte[] content = new byte[BufferSize - 1 + 1]; int dataRead; using (FileStream fs = fileinfo.OpenRead()) { long fileLen = fs.Length; if (progressHelper != null && handler != null) { progressHelper.SetProgress(handler, "正在上傳...", 0); } try { long proValue = 0; using (Stream rs = ftp.GetRequestStream()) { do { dataRead = fs.Read(content, 0, BufferSize); rs.Write(content, 0, dataRead); proValue += dataRead; if (progressHelper != null && handler != null) { progressHelper.SetProgress(handler, "正在上傳...", (int)((double)proValue * 100 / fileLen)); } } while (!(dataRead < BufferSize)); var aa = rs.Length; rs.Close(); } } catch (Exception) { } finally { fs.Close(); } } ftp = null; ////設置FTP命令 //ftp = GetRequest(URI); //ftp.Method = System.Net.WebRequestMethods.Ftp.Rename; //改名 //ftp.RenameTo = fileinfo.Name; //try //{ // ftp.GetResponse(); //} //catch (Exception ex) //{ // ftp = GetRequest(URI); // ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; //刪除 // ftp.GetResponse(); //} //ftp = null; return true; } catch (Exception) { return false; } } /// <summary> /// 下載文件 /// </summary> /// <param name="localDir">下載到本地(全路徑)</param> /// <param name="accessory">要下載的附件類</param> public static bool DownloadFile(string localFilePath, string ftpPath) { if (string.IsNullOrEmpty(ftpPath)) return false; if (string.IsNullOrEmpty(localFilePath)) return false; System.Net.FtpWebRequest ftp = null; try { string Url = ftpPath; string localDir = new FileInfo(localFilePath).DirectoryName; if (!Directory.Exists(localDir)) { Directory.CreateDirectory(localDir); } string tmpname = Guid.NewGuid().ToString(); string tmpFilePath = localDir + @"\" + tmpname; ftp = GetRequest(Url); // MsgBoxShow.ShowInformation(Url); ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (FileStream fs = new FileStream(tmpFilePath, FileMode.CreateNew)) { var aa = ftp.ContentLength; try { byte[] buffer = new byte[20480]; int read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, read); } while (!(read == 0)); responseStream.Close(); fs.Flush(); fs.Close(); } catch (Exception) { fs.Close(); File.Delete(tmpFilePath); return false; } } responseStream.Close(); } response.Close(); } try { File.Delete(localFilePath); File.Move(tmpFilePath, localFilePath); ftp = null; } catch (Exception) { File.Delete(tmpFilePath); return false; } ftp = null; return true; } catch (WebException e) { Common_LogManager.RecordLog(LogType.Error, e.Message, e); if (e.Status == WebExceptionStatus.ProtocolError) { Console.WriteLine("Status Code : {0}", ((FtpWebResponse)e.Response).StatusCode); Console.WriteLine("Status Description : {0}", ((FtpWebResponse)e.Response).StatusDescription); } return false; } } /// <summary> /// 下載文件,疊加 /// </summary> /// <param name="localDir">下載到本地(全路徑)</param> /// <param name="accessory">要下載的附件類</param> public static bool DownloadFileEx(string localFilePath, string ftpPath) { if (string.IsNullOrEmpty(ftpPath)) return false; if (string.IsNullOrEmpty(localFilePath)) return false; try { string Url = ftpPath; System.Net.FtpWebRequest ftp = GetRequest(Url); ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (FileStream fs = new FileStream(localFilePath, FileMode.Append)) { try { byte[] buffer = new byte[20480]; int read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, read); } while (!(read == 0)); responseStream.Close(); fs.Flush(); fs.Close(); } catch (Exception) { fs.Close(); return false; } } responseStream.Close(); } response.Close(); } try { ftp = null; } catch (Exception) { return false; } ftp = null; return true; } catch (Exception) { return false; } } /// <summary> /// 下載文件(包含進度) /// </summary> /// <param name="localDir">下載到本地(全路徑)</param> /// <param name="accessory">要下載的附件類</param> public static bool DownloadFile(string localFilePath, string ftpPath, ProgressHelper progressHelper, MessageProgressHandler handler) { if (string.IsNullOrEmpty(ftpPath)) return false; if (string.IsNullOrEmpty(localFilePath)) return false; try { string URI = ftpPath; string localDir = new FileInfo(localFilePath).DirectoryName; string tmpname = Guid.NewGuid().ToString(); string tmpFilePath = localDir + @"\" + tmpname; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; ftp.UseBinary = true; ftp.UsePassive = false; long fileLen = GetFileSize(ftpPath); using (WebResponse response = ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { if (progressHelper != null && handler != null) { progressHelper.SetProgress(handler, "正在下載...", 0); } using (FileStream fs = new FileStream(tmpFilePath, FileMode.OpenOrCreate)) { try { long proValue = 0; byte[] buffer = new byte[20480]; int read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, read); proValue += read; if (progressHelper != null && handler != null) { progressHelper.SetProgress(handler, "正在下載...", (int)((double)proValue * 100 / fileLen)); } } while (!(read == 0)); responseStream.Close(); fs.Flush(); fs.Close(); } catch (Exception) { fs.Close(); File.Delete(tmpFilePath); return false; } } responseStream.Close(); } response.Close(); } try { File.Delete(localFilePath); File.Move(tmpFilePath, localFilePath); ftp = null; } catch (Exception ex) { File.Delete(tmpFilePath); return false; } ftp = null; return true; } catch (Exception) { return false; } } /// <summary> /// 刪除文件 /// </summary> /// <param name="accessory">要刪除的附件全路徑</param> public static bool DeleteFile(string ftpPath) { if (string.IsNullOrEmpty(ftpPath)) return false; try { string URI = ftpPath; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { responseStream.Close(); } response.Close(); } ftp = null; return true; } catch (Exception) { return false; } } /// <summary> /// 搜索遠程文件 /// </summary> /// <param name="targetDir">文件夾</param> /// <param name="SearchPattern">搜索模式</param> /// <returns></returns> public static List<string> ListDirectory(string targetDir, string SearchPattern) { List<string> result = new List<string>(); try { string URI = targetDir + "/" + SearchPattern; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory; ftp.UsePassive = true; ftp.UseBinary = true; string str = GetStringResponse(ftp); str = str.Replace("\r\n", "\r").TrimEnd('\r'); str = str.Replace("\n", "\r"); if (str != string.Empty) result.AddRange(str.Split('\r')); return result; } catch { } return null; } private static string GetStringResponse(FtpWebRequest ftp) { string result = ""; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { long size = response.ContentLength; using (Stream datastream = response.GetResponseStream()) { using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default)) { result = sr.ReadToEnd(); sr.Close(); } datastream.Close(); } response.Close(); } return result; } public static void CheckAndMakeDir(string dirName) { if (string.IsNullOrEmpty(dirName)) { return; } if (dirName.Contains("/") || dirName.Contains("\\")) { var str = dirName.Split(new Char[] { '/', '\\' }); if (str.Length == 0 || string.IsNullOrEmpty(str[0])) { return; } string dir = str[0] + "/"; if (!IsExistsFile(dir)) MakeDir(dir); for (int i = 1; i < str.Length; i++) { if (string.IsNullOrEmpty(str[i])) { continue; } dir += (str[i] + "/"); if (!IsExistsFile(dir)) MakeDir(dir); } } else { if (!IsExistsFile(dirName)) MakeDir(dirName); } } /// /// 在ftp伺服器上創建目錄 /// </summary> /// <param name="dirName">創建的目錄名稱</param> public static void MakeDir(string dirName) { try { System.Net.FtpWebRequest ftp = GetRequest(dirName); ftp.Method = WebRequestMethods.Ftp.MakeDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); } catch (Exception ex) { //MessageBox.Show(ex.Message); } } /// <summary> /// 刪除目錄 /// </summary> /// <param name="dirName">刪除目錄名稱</param> public static bool delDir(string dirName) { try { System.Net.FtpWebRequest ftp = GetRequest(dirName); ftp.Method = WebRequestMethods.Ftp.RemoveDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); return true; } catch (Exception ex) { return false; } } /// <summary> /// 文件重命名 /// </summary> /// <param name="currentFilename">當前目錄名稱</param> /// <param name="newFilename">重命名目錄名稱</param> public static bool Rename(string currentFilename, string newFilename) { try { FileInfo fileInf = new FileInfo(currentFilename); System.Net.FtpWebRequest ftp = GetRequest(fileInf.Name); ftp.Method = WebRequestMethods.Ftp.Rename; ftp.RenameTo = newFilename; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); return true; } catch (Exception ex) { return false; } } private static FtpWebRequest GetRequest(string dirName) { string url = "ftp://" + ConfigHepler.FtpServer + "/" + dirName; //根據伺服器信息FtpWebRequest創建類的對象 FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(url); //提供身份驗證信息 result.Credentials = new System.Net.NetworkCredential(ConfigHepler.FtpUser, ConfigHepler.FtpPwd); //設置請求完成之後是否保持到FTP伺服器的控制連接,預設值為true result.KeepAlive = false; return result; } /// <summary> /// 判斷ftp伺服器上該目錄是否存在 /// </summary> /// <param name="dirName"></param> /// <returns></returns> public static bool IsExistsFile(string dirName) { bool flag = true; try { System.Net.FtpWebRequest ftp = GetRequest(dirName); ftp.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); } catch (Exception) { flag = false; } return flag; } // 獲取文件大小 public static long GetFileSize(string ftpPath) { long size = 0; if (string.IsNullOrEmpty(ftpPath)) return size; try { string URI = ftpPath; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.GetFileSize; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { size = response.ContentLength; } } catch (Exception) { } return size; } } /// <summary> /// 從配置文件獲取配置信息 /// </summary> public class ConfigHepler { private static string m_FtpServer; private static string m_FtpUser; private static string m_FtpPwd; /// <summary> /// ftp伺服器 /// </summary> public static string FtpServer { get { if (string.IsNullOrEmpty(m_FtpServer)) { string[] ftpConfigs = GlobalVars.FtpConfig.Split(new char[] { ';' }); if (ftpConfigs != null && ftpConfigs.Length > 0) m_FtpServer = ftpConfigs[0]; } return m_FtpServer; } } /// <summary> /// ftp用戶名 /// </summary> public static string FtpUser {