1. 程式人生 > >C# 利用FTP自動下載xml文件後利用 FileSystemWatcher 監控目錄下文件變化並自動更新數據庫

C# 利用FTP自動下載xml文件後利用 FileSystemWatcher 監控目錄下文件變化並自動更新數據庫

use img div 進行 ssa reg c# col without

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("60.208.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("", "", "60.208.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;
            }
        }

  

        /// 基姆拉爾森計算公式計算日期
        /// </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;
        }

    }
}

C# 利用FTP自動下載xml文件後利用 FileSystemWatcher 監控目錄下文件變化並自動更新數據庫