设为首页 收藏本站
查看: 859|回复: 0

[经验分享] c# from 中直接下载和上传iis中的文件。

[复制链接]

尚未签到

发表于 2017-12-28 08:20:15 | 显示全部楼层 |阅读模式
  using System.Globalization;
  using System.Net.NetworkInformation;
  using System .Net;
  //2017-2-23
  /// <summary>
  /// ftp文件上传、下载操作类
  /// </summary>
  /// <summary>
  /// ftp用户名,匿名为“”
  /// </summary>
  private string ftpUser;
  /// <summary>
  /// ftp用户密码,匿名为“”
  /// </summary>
  private string ftpPassWord;
  /// <summary>
  ///通过用户名,密码连接到FTP服务器
  /// </summary>
  /// <param name="ftpUser">ftp用户名,匿名为“”</param>
  /// <param name="ftpPassWord">ftp登陆密码,匿名为“”</param>
  public void FTPHelper(string ftpUser, string ftpPassWord)
  {
  this.ftpUser = ftpUser;
  this.ftpPassWord = ftpPassWord;
  }
  /// <summary>
  /// 匿名访问
  /// </summary>
  public void FTPHelper()
  {
  this.ftpUser = "";
  this.ftpPassWord = "";
  }
  /// <summary>
  /// 上传文件到Ftp服务器
  /// </summary>
  /// <param name="uri">把上传的文件保存为ftp服务器文件的uri,如"ftp://192.168.1.104/capture-212.avi"</param>
  /// <param name="upLoadFile">要上传的本地的文件路径,如D:\capture-2.avi</param>
  public void UpLoadFile(string UpLoadUri, string upLoadFile)
  {
  Stream requestStream = null;
  FileStream fileStream = null;
  FtpWebResponse uploadResponse = null;
  try
  {
  Uri uri = new Uri(UpLoadUri);
  FtpWebRequest uploadRequest = (FtpWebRequest)WebRequest.Create(uri);
  uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;
  uploadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
  requestStream = uploadRequest.GetRequestStream();
  fileStream = File.Open(upLoadFile, FileMode.Open);
  byte[] buffer = new byte[1024];
  int bytesRead;
  while (true)
  {
  bytesRead = fileStream.Read(buffer, 0, buffer.Length);
  if (bytesRead == 0)
  break;
  requestStream.Write(buffer, 0, bytesRead);
  }
  requestStream.Close();
  uploadResponse = (FtpWebResponse)uploadRequest.GetResponse();
  }
  catch (Exception ex)
  {
  throw new Exception("上传文件到ftp服务器出错,文件名:" + upLoadFile + "异常信息:" + ex.ToString());
  }
  finally
  {
  if (uploadResponse != null)
  uploadResponse.Close();
  if (fileStream != null)
  fileStream.Close();
  if (requestStream != null)
  requestStream.Close();
  }
  }
  /// <summary>
  /// 从ftp下载文件到本地服务器
  /// </summary>
  /// <param name="downloadUrl">要下载的ftp文件路径,如ftp://192.168.1.104/capture-2.avi</param>
  /// <param name="saveFileUrl">本地保存文件的路径,如(@"d:\capture-22.avi"</param>
  public void DownLoadFile(string downloadUrl, string saveFileUrl)
  {
  Stream responseStream = null;
  FileStream fileStream = null;
  StreamReader reader = null;
  try
  {
  // string downloadUrl = "ftp://192.168.1.104/capture-2.avi";
  FtpWebRequest downloadRequest = (FtpWebRequest)WebRequest.Create(downloadUrl);
  downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile;
  //string ftpUser = "yoyo";
  //string ftpPassWord = "123456";
  downloadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
  FtpWebResponse downloadResponse = (FtpWebResponse)downloadRequest.GetResponse();
  responseStream = downloadResponse.GetResponseStream();
  fileStream = File.Create(saveFileUrl);
  byte[] buffer = new byte[1024];
  int bytesRead;
  while (true)
  {
  bytesRead = responseStream.Read(buffer, 0, buffer.Length);
  if (bytesRead == 0)
  break;
  fileStream.Write(buffer, 0, bytesRead);
  }
  }
  catch (Exception ex)
  {
  throw new Exception("从ftp服务器下载文件出错,文件名:" + downloadUrl + "异常信息:" + ex.ToString());
  }
  finally
  {
  if (reader != null)
  {
  reader.Close();
  }
  if (responseStream != null)
  {
  responseStream.Close();
  }
  if (fileStream != null)
  {
  fileStream.Close();
  }
  }
  }
  /// <summary>
  /// 从FTP下载文件到本地服务器,支持断点下载
  /// </summary>
  /// <param name="ftpUri">ftp文件路径,如"ftp://localhost/test.txt"</param>
  /// <param name="saveFile">保存文件的路径,如C:\\test.txt</param>
  public void BreakPointDownLoadFile(string ftpUri, string saveFile)
  {
  System.IO.FileStream fs = null;
  System.Net.FtpWebResponse ftpRes = null;
  System.IO.Stream resStrm = null;
  try
  {
  //下载文件的URI
  Uri u = new Uri(ftpUri);
  //设定下载文件的保存路径
  string downFile = saveFile;
  //FtpWebRequest的作成
  System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest)
  System.Net.WebRequest.Create(u);
  //设定用户名和密码
  ftpReq.Credentials = new System.Net.NetworkCredential(ftpUser, ftpPassWord);
  //MethodにWebRequestMethods.Ftp.DownloadFile("RETR")设定
  ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
  //要求终了后关闭连接
  ftpReq.KeepAlive = false;
  //使用ASCII方式传送
  ftpReq.UseBinary = false;
  //设定PASSIVE方式无效
  ftpReq.UsePassive = false;
  //判断是否继续下载
  //继续写入下载文件的FileStream
  if (System.IO.File.Exists(downFile))
  {
  //继续下载
  ftpReq.ContentOffset = (new System.IO.FileInfo(downFile)).Length;
  fs = new System.IO.FileStream(
  downFile, System.IO.FileMode.Append, System.IO.FileAccess.Write);
  }
  else
  {
  //一般下载
  fs = new System.IO.FileStream(
  downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);
  }
  //取得FtpWebResponse
  ftpRes = (System.Net.FtpWebResponse)ftpReq.GetResponse();
  //为了下载文件取得Stream
  resStrm = ftpRes.GetResponseStream();
  //写入下载的数据
  byte[] buffer = new byte[1024];
  while (true)
  {
  int readSize = resStrm.Read(buffer, 0, buffer.Length);
  if (readSize == 0)
  break;
  fs.Write(buffer, 0, readSize);
  }
  }
  catch (Exception ex)
  {
  throw new Exception("从ftp服务器下载文件出错,文件名:" + ftpUri + "异常信息:" + ex.ToString());
  }
  finally
  {
  fs.Close();
  resStrm.Close();
  ftpRes.Close();
  }
  }
  #region 从FTP上下载整个文件夹,包括文件夹下的文件和文件夹
  /// <summary>
  /// 列出FTP服务器上面当前目录的所有文件和目录
  /// </summary>
  /// <param name="ftpUri">FTP目录</param>
  /// <returns></returns>
  public List<FileStruct> ListFilesAndDirectories(string ftpUri)
  {
  WebResponse webresp = null;
  StreamReader ftpFileListReader = null;
  FtpWebRequest ftpRequest = null;
  try
  {
  ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpUri));
  ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
  ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
  webresp = ftpRequest.GetResponse();
  ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.Default);
  }
  catch (Exception ex)
  {
  throw new Exception("获取文件列表出错,错误信息如下:" + ex.ToString());
  }
  string Datastring = ftpFileListReader.ReadToEnd();
  return GetList(Datastring);
  }
  /// <summary>
  /// 列出FTP目录下的所有文件
  /// </summary>
  /// <param name="ftpUri">FTP目录</param>
  /// <returns></returns>
  public List<FileStruct> ListFiles(string ftpUri)
  {
  List<FileStruct> listAll = ListFilesAndDirectories(ftpUri);
  List<FileStruct> listFile = new List<FileStruct>();
  foreach (FileStruct file in listAll)
  {
  if (!file.IsDirectory)
  {
  listFile.Add(file);
  }
  }
  return listFile;
  }
  /// <summary>
  /// 列出FTP目录下的所有目录
  /// </summary>
  /// <param name="ftpUri">FRTP目录</param>
  /// <returns>目录列表</returns>
  public List<FileStruct> ListDirectories(string ftpUri)
  {
  List<FileStruct> listAll = ListFilesAndDirectories(ftpUri);
  List<FileStruct> listDirectory = new List<FileStruct>();
  foreach (FileStruct file in listAll)
  {
  if (file.IsDirectory)
  {
  listDirectory.Add(file);
  }
  }
  return listDirectory;
  }
  /// <summary>
  /// 获得文件和目录列表
  /// </summary>
  /// <param name="datastring">FTP返回的列表字符信息</param>
  private List<FileStruct> GetList(string datastring)
  {
  List<FileStruct> myListArray = new List<FileStruct>();
  string[] dataRecords = datastring.Split('\n');
  FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);
  foreach (string s in dataRecords)
  {
  if (_directoryListStyle != FileListStyle.Unknown && s != "")
  {
  FileStruct f = new FileStruct();
  f.Name = "..";
  switch (_directoryListStyle)
  {
  case FileListStyle.UnixStyle:
  f = ParseFileStructFromUnixStyleRecord(s);
  break;
  case FileListStyle.WindowsStyle:
  f = ParseFileStructFromWindowsStyleRecord(s);
  break;
  }
  if (!(f.Name == "." || f.Name == ".."))
  {
  myListArray.Add(f);
  }
  }
  }
  return myListArray;
  }
  /// <summary>
  /// 从Unix格式中返回文件信息
  /// </summary>
  /// <param name="Record">文件信息</param>
  private FileStruct ParseFileStructFromUnixStyleRecord(string Record)
  {
  FileStruct f = new FileStruct();
  string processstr = Record.Trim();
  f.Flags = processstr.Substring(0, 10);
  f.IsDirectory = (f.Flags[0] == 'd');
  processstr = (processstr.Substring(11)).Trim();
  _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);   //跳过一部分
  f.Owner = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
  f.Group = _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
  _cutSubstringFromStringWithTrim(ref processstr, ' ', 0);   //跳过一部分
  string yearOrTime = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[2];
  if (yearOrTime.IndexOf(":") >= 0)  //time
  {
  processstr = processstr.Replace(yearOrTime, DateTime.Now.Year.ToString());
  }
  f.CreateTime = DateTime.Parse(_cutSubstringFromStringWithTrim(ref processstr, ' ', 8));
  f.Name = processstr;   //最后就是名称
  return f;
  }
  /// <summary>
  /// 从Windows格式中返回文件信息
  /// </summary>
  /// <param name="Record">文件信息</param>
  private FileStruct ParseFileStructFromWindowsStyleRecord(string Record)
  {
  FileStruct f = new FileStruct();
  string processstr = Record.Trim();
  string dateStr = processstr.Substring(0, 8);
  processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();
  string timeStr = processstr.Substring(0, 7);
  processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();
  DateTimeFormatInfo myDTFI = new CultureInfo("en-US", false).DateTimeFormat;
  myDTFI.ShortTimePattern = "t";
  f.CreateTime = DateTime.Parse(dateStr + " " + timeStr, myDTFI);
  if (processstr.Substring(0, 5) == "<DIR>")
  {
  f.IsDirectory = true;
  processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();
  }
  else
  {
  string[] strs = processstr.Split(new char[] { ' ' },2);// StringSplitOptions.RemoveEmptyEntries);   // true);
  processstr = strs[1];
  f.IsDirectory = false;
  }
  f.Name = processstr;
  return f;
  }
  /// <summary>
  /// 按照一定的规则进行字符串截取
  /// </summary>
  /// <param name="s">截取的字符串</param>
  /// <param name="c">查找的字符</param>
  /// <param name="startIndex">查找的位置</param>
  private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex)
  {
  int pos1 = s.IndexOf(c, startIndex);
  string retString = s.Substring(0, pos1);
  s = (s.Substring(pos1)).Trim();
  return retString;
  }
  /// <summary>
  /// 判断文件列表的方式Window方式还是Unix方式
  /// </summary>
  /// <param name="recordList">文件信息列表</param>
  private FileListStyle GuessFileListStyle(string[] recordList)
  {
  foreach (string s in recordList)
  {
  if (s.Length > 10
  && Regex.IsMatch(s.Substring(0, 10), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))
  {
  return FileListStyle.UnixStyle;
  }
  else if (s.Length > 8
  && Regex.IsMatch(s.Substring(0, 8), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))
  {
  return FileListStyle.WindowsStyle;
  }
  }
  return FileListStyle.Unknown;
  }
  /// <summary>
  /// 从FTP下载整个文件夹
  /// </summary>
  /// <param name="ftpDir">FTP文件夹路径</param>
  /// <param name="saveDir">保存的本地文件夹路径</param>
  public void DownFtpDir(string ftpDir, string saveDir)
  {
  List<FileStruct> files = ListFilesAndDirectories(ftpDir);
  if (!Directory.Exists(saveDir))
  {
  Directory.CreateDirectory(saveDir);
  }
  foreach (FileStruct f in files)
  {
  if (f.IsDirectory) //文件夹,递归查询
  {
  DownFtpDir(ftpDir + "/" + f.Name, saveDir + "\\" + f.Name);
  }
  else //文件,直接下载
  {
  DownLoadFile(ftpDir + "/" + f.Name, saveDir + "\\" + f.Name);
  }
  }
  }
  #endregion
  #region 文件信息结构
  public struct FileStruct
  {
  public string Flags;
  public string Owner;
  public string Group;
  public bool IsDirectory;
  public DateTime CreateTime;
  public string Name;
  }
  public enum FileListStyle
  {
  UnixStyle,
  WindowsStyle,
  Unknown
  }
  #endregion
  public void down_load_Click(object sender, EventArgs e)
  {
  /// <param name="ftpUri">ftp文件路径,如"ftp://localhost/test.txt"</param>
  /// <param name="saveFile">保存文件的路径,如C:\\test.txt</param>
  string xz="ftp://192.100.135.5/PIMExpress_mm/10002/372565/e676ccb4-8f30-49f2-91e6-34facca7d4f7";
  string cf_wz="C:\\L柜.dwg";
  DownLoadFile(xz,cf_wz);
  MessageBox.Show ("下载完毕");
  }
  }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-428849-1-1.html 上篇帖子: Startcom SSL证书申请 IIS设置 配置 攻略 下篇帖子: IIS下载无后缀文件的设置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表