1. C#开发windows服务实现自动从FTP服务器下载文件

     更新时间:2019年03月26日 14:50:59   作者:蝶恋花雨   我要评论

    这篇文章主要为大家详细介绍了C#开发windows服务实现自动从FTP服务器下载文件,具有一定的参考价值,感兴趣的小伙伴们可以参?#23478;?#19979;

    最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer来设置隔多长时间来下载。后?#20174;?#24819;想,用windwos服务来实现。

    效果图:

    执行的Log日志:

    INFO-2016/5/24 0:30:07--日志内容为:0/30/7进行time触发
    INFO-2016/5/24 1:30:07--日志内容为:1/30/7进行time触发
    INFO-2016/5/24 2:30:07--日志内容为:2/30/7进行time触发
    INFO-2016/5/24 3:30:07--日志内容为:3/30/7进行time触发
    INFO-2016/5/24 4:30:07--日志内容为:4/30/7进行time触发
    INFO-2016/5/24 5:30:07--日志内容为:5/30/7进行time触发
    INFO-2016/5/24 6:30:07--日志内容为:6/30/7进行time触发
    INFO-2016/5/24 7:30:07--日志内容为:7/30/7进行time触发
    INFO-2016/5/24 7:30:07--日志内容为:TimerEvent 01
    INFO-2016/5/24 7:30:07--日志内容为:TimerEvent 01 :共获取77个节目列表信息成功。
    INFO-2016/5/24 7:31:08--日志内容为:服务器与本地节目列表信息进行对比开始。
    INFO-2016/5/24 7:31:08--日志内容为:得到要更新的节目列表共77个
    INFO-2016/5/24 7:31:08--日志内容为:FileEvent 01 :BTV-1(高清).xml文件重新下载开始。
    INFO-2016/5/24 7:31:08--日志内容为:FileEvent 01 :BTV-1(高清).xml文件内容已于2016/05/24 00:01进行changed并重新下载成功。
    INFO-2016/5/24 7:31:08--日志内容为:FileEvent 01 :BTV-1(高清).xml文件下载后的修改时间开始与服务器修改时间同步开始。
    INFO-2016/5/24 7:31:08--日志内容为:FileEvent 01 :BTV-1(高清).xml文件下载后的修改时间开始与服务器修改时间同步成功。
    INFO-2016/5/24 7:31:08--日志内容为:FileEvent 02 :CCTV-1(高清).xml文件重新下载开始。
    INFO-2016/5/24 7:31:08--日志内容为:FileEvent 02 :CCTV-1(高清).xml文件内容已于2016/05/24 00:01进行changed并重新下载成功。
    INFO-2016/5/24 7:31:08--日志内容为:FileEvent 02 :CCTV-1(高清).xml文件下载后的修改时间开始与服务器修改时间同步开始。
    INFO-2016/5/24 7:31:08--日志内容为:FileEvent 02 :CCTV-1(高清).xml文件下载后的修改时间开始与服务器修改时间同步成功。
    INFO-2016/5/24 7:31:33--日志内容为:FileEvent 77 :黑龙江卫视(高清).xml文件重新下载开始。
    INFO-2016/5/24 7:31:33--日志内容为:FileEvent 77 :黑龙江卫视(高清).xml文件内容已于2016/05/24 00:01进行changed并重新下载成功。
    INFO-2016/5/24 7:31:33--日志内容为:FileEvent 77 :黑龙江卫视(高清).xml文件下载后的修改时间开始与服务器修改时间同步开始。
    INFO-2016/5/24 7:31:33--日志内容为:FileEvent 77 :黑龙江卫视(高清).xml文件下载后的修改时间开始与服务器修改时间同步成功。
    INFO-2016/5/24 8:31:08--日志内容为:8/31/8进行time触发
    INFO-2016/5/24 9:31:08--日志内容为:9/31/8进行time触发
    INFO-2016/5/24 10:31:08--日志内容为:10/31/8进行time触发
    INFO-2016/5/24 11:31:08--日志内容为:11/31/8进行time触发
    INFO-2016/5/24 12:31:08--日志内容为:12/31/8进行time触发
    INFO-2016/5/24 13:31:08--日志内容为:13/31/8进行time触发
    INFO-2016/5/24 14:31:08--日志内容为:14/31/8进行time触发
    INFO-2016/5/24 15:31:08--日志内容为:15/31/8进行time触发
    INFO-2016/5/24 16:31:08--日志内容为:16/31/8进行time触发
    INFO-2016/5/24 17:31:08--日志内容为:17/31/8进行time触发
    INFO-2016/5/24 18:31:08--日志内容为:18/31/8进行time触发
    INFO-2016/5/24 19:31:08--日志内容为:19/31/8进行time触发
    INFO-2016/5/24 20:31:08--日志内容为:20/31/8进行time触发
    INFO-2016/5/24 21:31:08--日志内容为:21/31/8进行time触发
    INFO-2016/5/24 22:31:08--日志内容为:22/31/8进行time触发
    INFO-2016/5/24 23:31:08--日志内容为:23/31/8进行time触发

    实现代码:

    下载 ftplib.dll 然后项目中参照引用

    using FtpLib;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.ServiceProcess;
    using System.Threading;
     
    namespace WindowsService1
    {
     public partial class Service1 : ServiceBase
     {
     private int _countFileChangeEvent = 0, _countTimerEvent = 0;
     
     private Thread ThreadDownLoad;
     
     public Service1()
     {
     InitializeComponent();
     }
     //http://blog.csdn.net/hwt0101/article/details/8514291
     //http://www.cnblogs.com/mywebname/articles/1244745.html
     //http://www.cnblogs.com/jzywh/archive/2008/07/23/filesystemwatcher.html
     //http://www.cnblogs.com/hfzsjz/archive/2011/01/07/1929898.html
     /// <summary>
     /// 服务启动的操作
     /// </summary>
     /// <param name="args"></param>
     protected override void OnStart(string[] args)
     {
     try
     {
     EventLog.WriteEntry("监控服务器与本地节目列表信息线程任务开始");//在系统事件查看器里的应用程序事件里来源的描述 
     WriteInLog("监控服务器与本地节目列表信息线程任务开始", false);
     System.Timers.Timer t = new System.Timers.Timer();
     // t.Interval = 60000;
      t.Interval = 60 * 60 * 1000;  
     t.Elapsed += new System.Timers.ElapsedEventHandler(BeginDowLoad);//到达时间的时候执行事件; 
     t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 
     t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件; 
     t.Start();
     }
     catch (Exception ex)
     {
     System.Diagnostics.Trace.Write(ex.Message);
     throw ex;
     }
     }
     /// <summary> 
     /// 定时检查,并执行方法 
     /// </summary> 
     /// <param name="source"></param> 
     /// <param name="e"></param> 
     public void BeginDowLoad(object source, System.Timers.ElapsedEventArgs e)
     {
     int intMinute = e.SignalTime.Minute;
     int intSecond = e.SignalTime.Second;
     int intHours = e.SignalTime.Hour;
     //设置 每天的07:30开始执行程序
     WriteInLog(intHours+"/"+ intMinute + "/"+ intSecond + "进行time触发", false);
     if (intHours == 07 ) ///定时设置,判断分时秒    && intMinute == 10
     {
     try
     {
      System.Timers.Timer tt = (System.Timers.Timer)source;
      tt.Enabled = false;
      DownLoadTvListInfo();
      tt.Enabled = true;
     }
     catch (Exception err)
     {
      WriteInLog(err.Message, false);
     }
     }
     }
     
     public List<ChannelTvListInfo> listFTPFiles(string FTPAddress, string username, string password)
     {
     List<ChannelTvListInfo> listinfo = new List<ChannelTvListInfo>();
     using (FtpConnection ftp = new FtpConnection(FTPAddress, username, password))
     {
     ftp.Open();
     ftp.Login();
     foreach (var file in ftp.GetFiles("/"))
     {
      listinfo.Add(new ChannelTvListInfo
      {
      TVName = file.Name,
      LastWriteTime = Convert.ToDateTime(file.LastWriteTime).ToString("yyyy/MM/dd HH:mm")
      });
     }
     ftp.Dispose();
     ftp.Close();
     }
     return listinfo;
     }
     /// <summary>
     /// 服务停止的操作
     /// </summary>
     protected override void OnStop()
     {
     try
     {
     ThreadDownLoad.Abort();
     WriteInLog("监控服务器与本地节目列表信息线程任务停止", false);
     System.Diagnostics.Trace.Write("监控服务器与本地节目列表信息线程任务停止");
     EventLog.WriteEntry("监控服务器与本地节目列表信息线程任务停止");
     }
     catch (Exception ex)
     {
     System.Diagnostics.Trace.Write(ex.Message);
     }
     }
     
     private List<ChannelTvListInfo> lstNewTvInfo, lstOldTvInfo = new List<ChannelTvListInfo>();
     private void DownLoadTvListInfo()
     {
     _countTimerEvent++;
     WriteInLog(string.Format("TimerEvent {0}", _countTimerEvent.ToString("#00")), false);
     lstNewTvInfo = listFTPFiles("222.206.159.xx", "xx", "xx");
     
     WriteInLog(string.Format("TimerEvent {0} :共获取{1}个节目列表信息成功。", _countTimerEvent.ToString("#00"),lstNewTvInfo.Count), false);
     lstOldTvInfo = new List<ChannelTvListInfo>();
     
     DirectoryInfo TheFolder = new DirectoryInfo(@"D:\Hello\UpLoadImg\ChannelTvXML");
     foreach (FileInfo NextFile in TheFolder.GetFileSystemInfos())
     {
     lstOldTvInfo.Add(new ChannelTvListInfo { TVName = NextFile.Name, LastWriteTime = NextFile.LastWriteTime.ToString("yyyy/MM/dd HH:mm") });
     }
      Thread.Sleep(60000);
     ThreadDownLoad = new Thread(new ThreadStart(Test));
     ThreadDownLoad.Start();
     
     WriteInLog("服务器与本地节目列表信息进行对比开始。", false);
     System.Diagnostics.Trace.Write("线程任务开始");
     }
     
     public void Test()
     {
     try
     {
     var result = lstNewTvInfo.Except(lstOldTvInfo, new ProductComparer()).ToList();
     WriteInLog("得到要更新的节目列表共"+ result.Count+"个", false);
     if (result.Count > 0)
     {
      foreach (var item in result)
      {
      _countFileChangeEvent++;
      WriteInLog(string.Format("FileEvent {0} :{1}文件重新下载开始。", _countFileChangeEvent.ToString("#00"),
      item.TVName), false);
     
      new FtpHelper().DownloadFtpFile("xx", "xx", "222.206.159.xx", @"D:\Hello\UpLoadImg\ChannelTvXML", item.TVName);
     
      WriteInLog(string.Format("FileEvent {0} :{1}文件内容已于{2}进行{3}", _countFileChangeEvent.ToString("#00"),
            item.TVName, item.LastWriteTime, "changed并重新下载成功。"), false);
     
      WriteInLog(string.Format("FileEvent {0} :{1}文件下载后的修改时间开始与服务器修改时间同步开始。", _countFileChangeEvent.ToString("#00"),
     item.TVName), false);
      File.SetLastWriteTime(@"D:\Hello\UpLoadImg\ChannelTvXML\" + item.TVName,
      Convert.ToDateTime(new FtpHelper().GetDateTimestamp("222.206.159.xx", item.TVName, "xx", "quanmeiti").xx("yyyy/MM/dd hh:mm tt")));
     
      WriteInLog(string.Format("FileEvent {0} :{1}文件下载后的修改时间开始与服务器修改时间同步成功。", _countFileChangeEvent.ToString("#00"),
     item.TVName), false);
     
      }
     }
     else
     {
      WriteInLog("暂无服务器电视节目列表更新", false);
     }
     
     }
     catch { }
     Thread.Sleep(60000);
     }
     
     /// <summary>
     /// 写入文件操作
     /// </summary>
     /// <param name="msg">写入内容</param>
     /// <param name="IsAutoDelete">是否删除</param>
     private void WriteInLog(string msg, bool IsAutoDelete)
     {
     try
     {
     string logFileName = @"D:\Hello\UpLoadImg\ChannelLog\DownTvList_" + DateTime.Now.ToString("yyyyMMdd") + "_log.txt" + ""; // 文件路径
     
     FileInfo fileinfo = new FileInfo(logFileName);
     if (IsAutoDelete)
     {
      if (fileinfo.Exists && fileinfo.Length >= 1024)
      {
      fileinfo.Delete();
      }
     }
     using (FileStream fs = fileinfo.OpenWrite())
     {
      StreamWriter sw = new StreamWriter(fs);
      sw.BaseStream.Seek(0, SeekOrigin.End);
      sw.Write("INFO-" + DateTime.Now.ToString() + "--日志内容为:" + msg + "\r\n");
      sw.Flush();
      sw.Close();
     }
     }
     catch (Exception ex)
     {
     ex.ToString();
     }
     }
     }
     
    }
    

    实现从FTP下载文件方法

     /// <summary>
     ///从ftp服务器上下载文件的功能
     /// </summary>
     /// <param name="userId"></param>
     /// <param name="pwd"></param>
     /// <param name="ftpUrl">ftp地址</param>
     /// <param name="filePath"></param>
     /// <param name="fileName"></param>
     public void DownloadFtpFile(string userId, string pwd, string ftpUrl, string filePath, string fileName)
     {
     FtpWebRequest reqFTP = null;
     FtpWebResponse response = null;
     try
     {
     String onlyFileName = Path.GetFileName(fileName);
     
     string downFileName = filePath + "\\" + onlyFileName;
     string url = "ftp://" + ftpUrl + "/" + fileName;
     if (File.Exists(downFileName))
     {
     DeleteDir(downFileName);
     }
     
     FileStream outputStream = new FileStream(downFileName, FileMode.Create);
     
     reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
     reqFTP.Credentials = new NetworkCredential(userId, pwd);
     reqFTP.UseBinary = true;
     reqFTP.UsePassive = true;
     reqFTP.KeepAlive = true;
     reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
     response = (FtpWebResponse)reqFTP.GetResponse();
     
     
     Stream 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)
     {
     throw ex;
     }
     }
    
    

    设置widnwos服务就不多介绍了。如下图:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    相关文章

    • 通过C#调用cmd来修改服务启动类型

      通过C#调用cmd来修改服务启动类型

      可以使用System.ServiceProcess.ServiceController这个类允许连接到正在运行或者已停止的服务、对其进行操作或获取有关它的信息但是这个类并没有提供修改服务启动类型的方法,可以通过C#调用cmd来修改
      2012-12-12
    • C#实现Access通用访问类OleDbHelper完整实例

      C#实现Access通用访问类OleDbHelper完整实例

      这篇文章主要介绍了C#实现Access通用访问类OleDbHelper,结合完整实例形式分析了C#针对access数据库的连接、查询、遍历、分页显示等相关操作技巧,需要的朋友可以参考下
      2017-02-02
    • C#数组的常用操作方法小结

      C#数组的常用操作方法小结

      Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收?#35789;?#34255;
      2016-05-05
    • c#操作sqlserver数据库的简单示例

      c#操作sqlserver数据库的简单示例

      这篇文章主要介绍了c#操作sqlserver数据库的简单示例,需要的朋友可以参考下
      2014-04-04
    • C#使用foreach语句遍历队列(Queue)的方法

      C#使用foreach语句遍历队列(Queue)的方法

      这篇文章主要介绍了C#使用foreach语句遍历队列(Queue)的方法,涉及foreach语句的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
      2015-04-04
    • C# 以MDF文件链接数据库的示例代码

      C# 以MDF文件链接数据库的示例代码

      本篇文章主要介绍了C# 以MDF文件链接数据库的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
      2017-09-09
    • C# WebApi 路由机制剖析

      C# WebApi 路由机制剖析

      这篇文章主要介绍了C# WebApi 路由机制剖析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
      2018-07-07
    • C#实现对二维数组排序的方法

      C#实现对二维数组排序的方法

      这篇文章主要介绍了C#实现对二维数组排序的方法,实例分析了C#数组遍历与排序的相关技巧,需要的朋友可以参考下
      2015-06-06
    • C#实现程序开机启动的方法

      C#实现程序开机启动的方法

      这篇文章主要介绍了C#实现程序开机启动的方法,涉及C#针对应用程序及注册表的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
      2016-06-06
    • C# 执行bat批处理文件的小例子

      C# 执行bat批处理文件的小例子

      这篇文章介绍了C# 执行bat批处理文件的小例子,有需要的朋友可以参?#23478;?#19979;
      2013-10-10

    最新评论

    山东群英会开奖查询
      1. p3试机号体彩排列三试机号 京东商城的京东彩票入口在哪 竟彩网首网 陕西快乐十分任四技巧 体彩海南飞鱼网上投注 河北20选5开奖走势图百度乐彩网 极速十一选五前二 %准确的特码资料 四不像\/一肖中特图 双色球蓝球字迷 贵州快三选号技巧 黑龙江时时彩号码走势 超级大乐透规则 3d试机号后 青海快3规律破解