热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要为大家详细介绍了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
 /// 
 /// 服务启动的操作
 /// 
 /// 
 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;
 }
 }
 ///  
 /// 定时检查,并执行方法 
 ///  
 ///  
 ///  
 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 listFTPFiles(string FTPAddress, string username, string password)
 {
 List listinfo = new List();
 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;
 }
 /// 
 /// 服务停止的操作
 /// 
 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 lstNewTvInfo, lstOldTvInfo = new List();
 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();
 
 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);
 }
 
 /// 
 /// 写入文件操作
 /// 
 /// 写入内容
 /// 是否删除
 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下载文件方法

 /// 
 ///从ftp服务器上下载文件的功能
 /// 
 /// 
 /// 
 /// ftp地址
 /// 
 /// 
 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服务就不多介绍了。如下图:

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


推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 本文详细介绍如何在 Windows 环境下安装 Ubuntu 12.04 版本的 Linux 操作系统,包括必要的软件下载、配置步骤以及注意事项。 ... [详细]
  • 随着技术社区的发展,越来越多的技术爱好者选择通过撰写博客来分享自己的学习经验和项目进展。本文将介绍一个具体案例,即将一套原本运行于Windows平台的代码成功移植到Linux(Redhat)环境下的过程与挑战。 ... [详细]
  • 在Windows Server 2008 R2上配置IIS FTP服务
    本文详细介绍了如何在Windows Server 2008 R2操作系统上通过IIS配置FTP服务的过程,包括服务器角色的选择与安装、FTP站点的创建以及必要的服务和防火墙设置检查。 ... [详细]
  • 推荐两款实用的网络诊断工具
    大家好,因为一些私事很久没有更新博客了。今天向大家介绍两款非常有用的网络诊断工具——Tracert和Telnet,帮助你更好地理解和解决网络问题。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
  • 在使用Maven进行项目构建时,由于依赖库的下载速度慢常常让人感到沮丧,这直接影响了开发效率和学习热情。幸运的是,阿里云提供了一个快速的国内镜像服务,能够显著提升Maven项目的构建速度。 ... [详细]
  • JavaWeb技术架构解析
    本文探讨了JavaWeb开发中客户端与服务器端的交互模式,重点分析了B/S(浏览器/服务器)和C/S(客户端/服务器)两种架构的特点及应用场景。 ... [详细]
  • 本文探讨了如何利用SqlDependency执行复杂的SQL查询,并确保在多线程环境下的安全性与效率。 ... [详细]
  • Python数据类型6 字典
    字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 使用LVS与ldirectord实现高可用负载均衡
    本文介绍了如何通过LVS(Linux Virtual Server)结合ldirectord工具来实现服务器的健康检查及负载均衡功能。环境设置包括一个LVS节点和两个真实服务器节点,通过配置ldirectord进行健康状态监测,确保系统的高可用性。 ... [详细]
author-avatar
命注定啊_894
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有