C# 利用FTP自动下载xml文件后利用 FileSystemWatcher 监控目录下文件变化并自动更新数据库

using FtpLib;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace WindowsService1
{
	public partial class Service1 : ServiceBase
	{
		private int TimeoutMillis = 2000; //定时器触发间隔
		private int _countFileChangeEvent = 0, _countTimerEvent = 0;
		System.IO.FileSystemWatcher fsw = new System.IO.FileSystemWatcher();
		System.Threading.Timer m_timer = null;
		System.Threading.Timer m_timerDownLoad = null;
		List<String> files = new List<string>(); //记录待处理文件的队列

		private Thread ThreadHello;
		private Thread ThreadDownLoad;
		private List<ChannelTvListInfo> lstNewTvInfo;
 
		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
		/// <summary>
		/// 服务启动的操作
		/// </summary>
		/// <param name="args"></param>
		protected override void OnStart(string[] args)
		{
			try
			{
				ThreadDownLoad = new Thread(new ThreadStart(ThreadTime));
				ThreadDownLoad.Start();
				ThreadHello = new Thread(new ThreadStart(Hello));
				ThreadHello.Start();
				WriteInLog("服务线程任务开始", false);
				System.Diagnostics.Trace.Write("线程任务开始");

			}
			catch (Exception ex)
			{
				System.Diagnostics.Trace.Write(ex.Message);
				throw ex;
			}
		}
		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
			{
				ThreadHello.Abort();
				WriteInLog("服务线程停止", false);
				System.Diagnostics.Trace.Write("线程停止");
			}
			catch (Exception ex)
			{
				System.Diagnostics.Trace.Write(ex.Message);
			}
		}

		private void Hello()
		{
			try
			{
				fsw.Filter = "*.xml"; //设置监控文件的类型
					fsw.Path = @"D:\ChannelTvXML";   //设置监控的文件目录
					fsw.IncludeSubdirectories = true;   //设置监控C盘目录下的所有子目录
					fsw.InternalBufferSize = 100000;
					fsw.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.Size | NotifyFilters.LastWrite |
														 NotifyFilters.FileName | NotifyFilters.DirectoryName; ;   //设置文件的文件名、目录名及文件的大小改动会触发Changed事件
					fsw.Changed += new FileSystemEventHandler(this.fsw_Changed);
					fsw.Error += new ErrorEventHandler(this.fsw_Error);
					fsw.EnableRaisingEvents = true;
					// Create the timer that will be used to deliver events. Set as disabled
					if (m_timer == null)
					{
						//设置定时器的回调函数。此时定时器未启动
						m_timer = new System.Threading.Timer(new TimerCallback(OnWatchedFileChange),
																				 null, Timeout.Infinite, Timeout.Infinite);
					}
				 
			}
			catch (Exception ex)
			{
				System.Diagnostics.Trace.Write(ex.Message);
				throw ex;
			}

			Thread.Sleep(5000);

		}
		private void ThreadTime()
		{
			List<ChannelTvListInfo> lstNewTvInfo = listFTPFiles("xxx.xx.140.170", "", "");
			WriteInLog(lstNewTvInfo.Count + "获取列表信息成功", false);
			// Create the timer that will be used to deliver events. Set as disabled
			if (m_timerDownLoad == null)
			{
				//设置定时器的回调函数。此时定时器未启动
				m_timerDownLoad = new System.Threading.Timer(new TimerCallback(DownLoadTvListInfo),
																		 null, Timeout.Infinite, Timeout.Infinite);
			}
			Thread.Sleep(5000);
		}
		private void DownLoadTvListInfo(object state)
		{
			List<ChannelTvListInfo> lstOldTvInfo = new List<ChannelTvListInfo>();
			DirectoryInfo TheFolder = new DirectoryInfo(@"D:\ChannelTvXML");
			foreach (FileInfo NextFile in TheFolder.GetFileSystemInfos())
			{
				lstOldTvInfo.Add(new ChannelTvListInfo { TVName = NextFile.Name, LastWriteTime = NextFile.LastWriteTime.ToString("yyyy/MM/dd HH:mm") });
			}
			var result = lstNewTvInfo.Except(lstOldTvInfo, new ProductComparer()).ToList();
			if (result.Count > 0)
			{
				foreach (var item in result)
				{
					new FtpHelper().DownloadFtpFile("", "", "xx.xx.140.170", @"D:\ChannelTvXML", item.TVName);
					WriteInLog(item.TVName + "下载成功", false);
				}
			}
			}
    private void fsw_Changed(object sender, FileSystemEventArgs e)
		{
			Mutex mutex = new Mutex(false, "Wait");
			mutex.WaitOne();
			if (!files.Contains(e.Name))
			{
				files.Add(e.Name);
			}
			mutex.ReleaseMutex();

			//重新设置定时器的触发间隔,并且仅仅触发一次
			m_timer.Change(TimeoutMillis, Timeout.Infinite);

		}
		/// <summary>
		/// 定时器事件触发代码:进行文件的实际处理
		/// </summary>
		/// <param name="state"></param>

		private void OnWatchedFileChange(object state)
		{
			_countTimerEvent++;
			WriteInLog(string.Format("TimerEvent {0}", _countTimerEvent.ToString("#00")), false);
			List<String> backup = new List<string>();
			Mutex mutex = new Mutex(false, "Wait");
			mutex.WaitOne();
			backup.AddRange(files);
			files.Clear();
			mutex.ReleaseMutex();

			foreach (string file in backup)
			{
				_countFileChangeEvent++;
				WriteInLog(string.Format("FileEvent {0} :{1}文件已于{2}进行{3}", _countFileChangeEvent.ToString("#00"),
					 file, DateTime.Now, "changed"), false);
			}

		}
		private void fsw_Error(object sender, ErrorEventArgs e)
		{
			WriteInLog(e.GetException().Message, false);
		}
		/// <summary>
		/// 写入文件操作
		/// </summary>
		/// <param name="msg">写入内容</param>
		/// <param name="IsAutoDelete">是否删除</param>
		private void WriteInLog(string msg, bool IsAutoDelete)
		{
			try
			{
				string logFileName = @"D:\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.WriteLine("=====================================");
					sw.Flush();
					sw.Close();
				}
			}
			catch (Exception ex)
			{
				ex.ToString();
			}
		}
	}

}
FtpHelper.cs 类代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace WindowsService1
{
	public class FtpHelper
	{
		private FtpWebRequest ftpRequest = null;
		private FtpWebResponse ftpResponse = null;
		private Stream ftpStream = null;

		/// <summary>
		///  Get Filelist  Name
		/// </summary>
		/// <param name="userId">ftp userid</param>
		/// <param name="pwd">ftp password</param>
		/// <param name="ftpIP">ftp ip</param>
		/// <returns></returns>
		public string[] GetFtpFileName(string userId, string pwd, string ftpIP, string filename)
		{
			string[] downloadFiles;
			StringBuilder result = new StringBuilder();
			try
			{
				ftpRequest = (FtpWebRequest)FtpWebRequest.Create(ftpIP + "/" + filename);
				ftpRequest.Credentials = new NetworkCredential(userId, pwd);
				ftpRequest.UseBinary = true;
				ftpRequest.UsePassive = true;
				ftpRequest.KeepAlive = true;
				ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
				ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
				ftpStream = ftpResponse.GetResponseStream();
				StreamReader ftpReader = new StreamReader(ftpStream);
				string line = ftpReader.ReadLine();
				while (line != null)
				{
					result.Append(line);
					result.Append("\n");
					line = ftpReader.ReadLine();
				}
				result.Remove(result.ToString().LastIndexOf('\n'), 1);
		
				ftpReader.Close();
				ftpStream.Close();
				ftpResponse.Close();
				ftpRequest = null;
				return result.ToString().Split('\n');

			}
			catch (Exception ex)
			{
				downloadFiles = null;
				return downloadFiles;
			}
		}

		public string[] GetFtpFileName(string userId, string pwd, string ftpIP)
		{
			string[] downloadFiles;
			StringBuilder result = new StringBuilder();
			try
			{
				ftpRequest = (FtpWebRequest)FtpWebRequest.Create(ftpIP + "/");
				ftpRequest.Credentials = new NetworkCredential(userId, pwd);
				ftpRequest.UseBinary = true;
				ftpRequest.UsePassive = true;
				ftpRequest.KeepAlive = true;
				ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
				ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
				ftpStream = ftpResponse.GetResponseStream();
				StreamReader ftpReader = new StreamReader(ftpStream);
				string line = ftpReader.ReadLine();
				while (line != null)
				{
					result.Append(line);
					result.Append("\n");
					line = ftpReader.ReadLine();
				}
				result.Remove(result.ToString().LastIndexOf('\n'), 1);
 
				ftpReader.Close();
				ftpStream.Close();
				ftpResponse.Close();
				ftpRequest = null;
 				return result.ToString().Split('\n');
		  
			}
			catch (Exception ex)
			{
				downloadFiles = null;
				return downloadFiles;
			}
		}

		/// <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;
			}
		}

  
        public DateTime GetDateTimestamp(string ftpUrl, string remoteFile, string username, string password)
        {
            string url = "ftp://" + ftpUrl + "/" + remoteFile;
            FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
            reqFTP.Credentials = new NetworkCredential(username, password);
            reqFTP.UseBinary = true;
            reqFTP.UsePassive = true;
            reqFTP.KeepAlive = true;
            reqFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp;
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

            return response.LastModified;
        }
		/// 基姆拉尔森计算公式计算日期
		/// </summary>
		/// <param name="y">年</param>
		/// <param name="m">月</param>
		/// <param name="d">日</param>
		/// <returns>星期几</returns>

		public static string CaculateWeekDay(int y, int m, int d)
		{
			if (m == 1 || m == 2)
			{
				m += 12;
				y--;         //把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
			}
			int week = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
			string weekstr = "";
			switch (week)
			{
				case 0: weekstr = "星期一"; break;
				case 1: weekstr = "星期二"; break;
				case 2: weekstr = "星期三"; break;
				case 3: weekstr = "星期四"; break;
				case 4: weekstr = "星期五"; break;
				case 5: weekstr = "星期六"; break;
				case 6: weekstr = "星期日"; break;
			}
			return weekstr;
		}
		/// <summary>
		/// 返回不带后缀的文件名
		/// </summary>
		/// <param name="fileName"></param>
		/// <returns></returns>
		public static string GetFirstFileName(string fileName)
		{
			return Path.GetFileNameWithoutExtension(fileName);
		}
		#region 删除指定目录以及该目录下所有文件
		/// </summary><param name="dir">欲删除文件或者目录的路径</param>
		public static void DeleteDir(string dir)
		{
			CleanFiles(dir);//第一次删除文件
			CleanFiles(dir);//第二次删除目录
		}
		/// <summary>
		/// 删除文件和目录
		/// </summary>
		///使用方法Directory.Delete( path, true)
		private static void CleanFiles(string dir)
		{
			if (!Directory.Exists(dir))
			{
				File.Delete(dir); return;
			}
			else
			{
				string[] dirs = Directory.GetDirectories(dir);
				string[] files = Directory.GetFiles(dir);
				if (0 != dirs.Length)
				{
					foreach (string subDir in dirs)
					{
						if (null == Directory.GetFiles(subDir))
						{ Directory.Delete(subDir); return; }
						else CleanFiles(subDir);
					}
				}
				if (0 != files.Length)
				{
					foreach (string file in files)
					{ File.Delete(file); }
				}
				else Directory.Delete(dir);
			}
		}
		#endregion
	}
	public class ChannelListInfo
	{
		//   public string ChannelID { get; set; }
		public string WeekDate { get; set; }
		public string ChannelTV { get; set; }
		public string ChannelName { get; set; }
		public string ChannelType { get; set; }
		public string ChannelSummary { get; set; }
		//   public string ChannelImg { get; set; }

		public DateTime ChannelStartDate { get; set; }
		public DateTime ChannelEndDate { get; set; }
		//   public DateTime? AddTime { get; set; }
		public DateTime? ChannelPlayDate { get; set; }


	}
	public class ChannelTvListInfo
	{
		public string TVName { get; set; }
		public string LastWriteTime { get; set; }
	}
	// Custom comparer for the Product class
	public class ProductComparer : IEqualityComparer<ChannelTvListInfo>
	{
		// Products are equal if their names and product numbers are equal.
		public bool Equals(ChannelTvListInfo x, ChannelTvListInfo y)
		{

			//Check whether the compared objects reference the same data.
			if (Object.ReferenceEquals(x, y)) return true;

			//Check whether any of the compared objects is null.
			if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
				return false;

			//Check whether the products' properties are equal.
			return x.TVName == y.TVName && x.LastWriteTime == y.LastWriteTime;
		}

		// If Equals() returns true for a pair of objects 
		// then GetHashCode() must return the same value for these objects.

		public int GetHashCode(ChannelTvListInfo product)
		{
			//Check whether the object is null
			if (Object.ReferenceEquals(product, null)) return 0;

			//Get hash code for the Name field if it is not null.
			int hashProductName = product.TVName == null ? 0 : product.TVName.GetHashCode();

			//Get hash code for the Code field.
			int hashProductCode = product.LastWriteTime.GetHashCode();

			//Calculate the hash code for the product.
			return hashProductName ^ hashProductCode;
		}

	}
}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
可以使用C#提供的FileSystemWatcher类来实现监控文件夹和里面文件变化。以下是一个简单的示例代码: ```csharp using System; using System.IO; class Program { static void Main(string[] args) { // 创建一个新的FileSystemWatcher对象 FileSystemWatcher watcher = new FileSystemWatcher(); // 设置要监控文件夹路径 watcher.Path = @"C:\myfolder"; // 监控所有类型的文件 watcher.Filter = "*.*"; // 监控文件变化的类型 watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // 添加事件处理程序 watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // 启动监控 watcher.EnableRaisingEvents = true; Console.WriteLine("Press any key to stop monitoring..."); Console.ReadKey(); } // 处理文件变化事件 private static void OnChanged(object source, FileSystemEventArgs e) { Console.WriteLine($"File: {e.FullPath} {e.ChangeType}"); } // 处理文件重命名事件 private static void OnRenamed(object source, RenamedEventArgs e) { Console.WriteLine($"File: {e.OldFullPath} renamed to {e.FullPath}"); } } ``` 这个示例代码会监控C:\myfolder文件夹中的所有文件变化,并在控制台输出变化的信息。你可以根据需要修改要监控文件夹路径、要监控文件类型和要监控变化类型,并根据需要添加其他事件处理程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值