C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)

最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer来设置隔多长时间来下载。后来又想想了。用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:\GoodLook\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:\GoodLook\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:\GoodLook\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:\GoodLook\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服务就不多介绍了。如下图:

时间: 2024-11-08 13:35:12

C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)的相关文章

C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件

使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. 1 /// <summary> 2 /// 入口方法 3 /// </summary> 4 /// <param name="args">参数</param> 5 public static void Main(string[] args) 6 { 7 // 加载Log4net模块 8 LogHelper.SetConfig(&

杂记2:VS2013创建Windows服务实现自动发送邮件

这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务项目 首先,有人提问VS2013找不到创建Windows服务项目的选项,答案是在“Windows 桌面”目录下: 步骤二:重命名服务,添加Timer组件 重命名默认创建的Service1服务,比如MyMailService:然后在设计界面添加Timer组件. 这里要注意,VS工具箱默认提供的是Sys

win7下用c#开发windows服务

1.首选我们需要打开VS2008,然后点击文件-->新建-->项目,选择Visual C#-->windows-->windows服务.如下图所示: 2.然后修改Service1.cs类. 我们需要重写OnStart和OnStop方法.代码如下所示: [csharp] view plaincopy using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat

.net开发windows服务小结 (转发)

.net开发windows服务小结 今天学习了在.net下创建一个windows服务,总结一下学习心得. 开发环境:visual studio 2012 一.编写程序 (1)创建一个空解决方法 (2)添加一个控制台应用程序项目 (3)添加一个Windows服务,如下所示: (4)右键 查看代码 看到如下代码: public WindowsService() { InitializeComponent(); } protected override void OnStart(string[] ar

在Windows XP系统下架设FTP服务器需要5个步骤。

4步win7下简单FTP服务器搭建:http://blog.sina.com.cn/s/blog_3f7e47f20100haur.html 申请网域护照(即帐户),开通免费域名.连接到www.oray.net,在页面左边点击“注册护照”,按照提示完成注册即可.然后在左面再点“域名服务中心”,选择下拉菜单的“注册域名记录”,之后在“免费域名”框内输入你的个性域名就行了.   本机安装动态域名解析软件.即花生壳客户端.下载完成后同样按提示安装,在到如下图的步骤时,请输入我们刚才在网站上注册的帐户及

putty windows上传文件到linux服务器 &amp; 从linux服务器 下载文件到 windows

从putty官网下载putty软件:putty.exepscp.exepsftp.exe等软件 也可以自己下windows安装包putty-0.63-installer.exe 本人直接下载putty-0.63-installer.exe安装包了,然后直接安装 使用pscp方式从windows上传文件到linux服务器 在CMD命令行中进入到putty安装目录 输入pscp 回车 pscp 跟我们平时使用的linux scp命令操作的都是类似的 现在我直接从windows本地上传一个文件到lin

Windows server 2008 布署FTP服务器实例(适用于阿里云)!

Windows server 2008 布署FTP服务器实例(适用于阿里云). 1.打开管理.配置-用户-新建用户,如:ftp_user,并设置password.选择永只是期和password不能更改,其它的不用动. 2.在IIS(此处忽略)中右建网站.新建-ftp网站,重点两个方面.一个是不要ssl,一个是选择基本身份验证,输入创建的username! OK,假设21port正常开启的情况下,就能够了. 让ftp用户,不能在server登陆,详细的方法例如以下: 1.执行regedit.打开注

使用Topshelf 开发windows服务

在业务系统中,我们为了调度一些自动执行的任务或从队列中消费一些消息,所以基本上都会涉及到后台服务的开发.如果用windows service开发,非常不爽的一件事就是:调试相对麻烦,而且你还需要了解 windows service 相关的一些开发和安装部署,所以,windows service非常的不方便.Topshelf框架,能够让你将 console application 直接封装为 windows service,这样你在开发的时候,就可以直接在console 程序上开发,然后构成win

vs2015开发Windows服务

工作已经很久,时隔这么长时间写这篇文章是给自己以后做参考.也不至于以后长时间不写Windows服务而忘记整个开发过程.windows服务开发,基础的就不说了,直接上过程. 1.新建windows服务项目,我这里选择的是Framework4.0,没有选择高版本是为了防止在服务在一些低版本系统上无法正常运行. 2.添加Windows服务的安装程序. 在默认Service1设计器界面空白处点击右键->添加安装程序,系统会自动新建一个带有默认配置的安装程序类,如下图: 新建完安装程序后,需要给默认的se