帮助类:
- 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
- {
- get
- {
- if (string.IsNullOrEmpty(m_FtpUser))
- {
- string[] ftpConfigs = GlobalVars.FtpConfig.Split(new char[] { ';' });
- if (ftpConfigs != null && ftpConfigs.Length > 1)
- m_FtpUser = ftpConfigs[1];
- }
- return m_FtpUser;
- }
- }
- /// <summary>
- /// ftp密码
- /// </summary>
- public static string FtpPwd
- {
- get
- {
- if (string.IsNullOrEmpty(m_FtpPwd))
- {
- string[] ftpConfigs = GlobalVars.FtpConfig.Split(new char[] { ';' });
- if (ftpConfigs != null && ftpConfigs.Length > 2)
- m_FtpPwd = ftpConfigs[2];
- }
- return m_FtpPwd;
- }
- }
- }
- }
配置文件配置:
例子:
上传调用例子:
- FileInfo fInfo = new FileInfo(txtDoc.Text);
- //上传到ftp的完整目录,FTP目录+文件格式+日期+GUID+文件名+文件后缀
- ftpPath = M_FTPDIRECTORY + m_Archives.DocType.Replace(".", "") + "/" + DateTime.Now.ToString("yyyyMMdd") + "/" + Guid.NewGuid().ToString() + "/" + m_Archives.DocName + m_Archives.DocType;
- bool suc = FtpHelper.UploadFile(fInfo, ftpPath);