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:\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服务就不多介绍了。如下图:

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

(0)

相关推荐

  • windows10彻底关闭自动更新【绝对可行】

    以下三步必须全做: 1.服务里禁用Windows Update 2.将服务里的Windows Update的恢复设置为无操作 3.删除自动更新的触发器(这个很重要,否则过一段时间自动更新还是会打开的) "Win键 + R">> 在运行框中输入"services.msc"后点击确定打开服务>>找到Windows Update 双击"Windows Update"(或右键属性) >> "常规"选

  • 在Windows下自动备份PostgreSQL的教程

    背景 在我工作上一个使用PostgreSQL数据库的项目上需要一个自动化系统来每天执行备份.经过一番研究决定通过创建一个Windows批处理文件并添加到Windows计划任务中来实现. 下面是具体步骤: 怎样配置 第一步: 下载批处理文件. 第二步: 你可以通过一个简单的命令(schtasks /?查看帮助)或者使用图形界面(开始-控制面板-系统和安全-管理工具-任务计划程序)运行任务计划管理工具,还可以在%SYSTEMROOT%\System32目录下双击Taskschd.msc来启动它.  

  • Electron autoUpdater实现Windows安装包自动更新的方法

    前言 Electron帮助我们突破浏览器的界限,通过Electron构建的桌面应用拥有各种浏览器应用梦寐以求的能力. Electron提供的autoUpdater还可以帮助我们实现桌面应用的自动更新. 文件结构 首先,我们已经有了一个基于Electron做的应用,项目中有两个package.json.这样做的一个原因是将devDependencies和dependencies分开了,另外就是不需要在打包的时候再去指定哪些依赖不需要一起打到安装包里面去了(通过ignore参数). 目录结构类似于这

  • Windows下支持自动更新的Electron应用脚手架的方法

    前言 之前写过一篇关于 Windows 下通过 Electron 自带的 autoUpdater 实现应用自动更新的文章,很多小伙伴私信问我要具体实现代码,不过因为之前一直很忙(还有懒...). 这两周正好周末比较空,除了在 github 上搭建了一个脚手架,还顺便把实现优化了一波,下面将会带着大家从零开始详细介绍实现过程,对小白也很友好的教程哦. 从零开始 进入你的工作目录,比如 d/workspace # 目录 d/workspace mkdir electron-demo # 新建文件夹

  • 在Windows环境下使用MySQL:实现自动定时备份

    一.编写备份脚本 rem auther:www.yumi-info.com rem date:20171222 rem ******MySQL backup start******** @echo off forfiles /p "E:\mysql\MySQL BackUp" /m backup_*.sql -d -30 /c "cmd /c del /f @path" set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0

  • Windows系统自动连接网络共享打印机BAT脚本分享

    最近几天财务老是闹连不上网络打印机,教了她几遍要在cmd里输入net use \\192.168.10.131 /user:guest 回车后再输入密码,实在是烦了,直接写了个bat脚本给她使用. 脚本内容: 复制代码 代码如下: @echo off echo 添加网络打印机 echo 等待.... sc config spooler start= auto net stop spooler & net start spooler rem 只需替换以下ip.打印机名.帐号.密码为具体名称即可 n

  • windows长时间保持远程桌面不被自动断开

    用过Windows远程桌面连接服务器可能都会发现,正在远程桌面连接如果不进行一些操作,过上个几分钟一会儿之后远程桌面连接就会需要登录,有时还是直接断开需要重新连接才行.其实有关这个问题大家可以直接在远程连接电脑上进行一些设置即可解决. win2008系统: 开始-->运行-->gpedit.msc 计算机配置->管理模板->Windows组件->远程桌面服务->远程桌面会话主机->会话时间限制 找到下图这两个选项: 分别双击打开这两项设置,按下图红框标识设置好,确

  • windows mysql 自动备份的几种方法汇总

    基于之前的文章方法,加入批处理命令即可实现自动备份.只是由于批处理命令中对于备份文件的名字按照时间命名比较特别,所以特别整理一文. 1.复制date文件夹备份 ============================ 假想环境: MySQL   安装位置:C:\MySQL 论坛数据库名称为:bbs 数据库备份目的地:C:\db_bak\ ============================ 新建db_bak.bat,写入以下代码 *******************************

  • 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/

  • python实现从ftp服务器下载文件

    代码之余,将代码过程重要的一些代码段备份一下,如下的代码内容是关于Python从ftp服务器下载文件的的代码,希望能对小伙伴有用途. #coding=utf-8 ''' ftp自动下载.自动上传脚本,可以递归目录操作 ''' from ftplib import FTP import os,sys,string,datetime,time import socket class MYFTP: def __init__(self, hostaddr, username, password, rem

  • python实现从ftp服务器下载文件的方法

    本文实例讲述了python实现从ftp服务器下载文件的方法.分享给大家供大家参考.具体实现方法如下: import ftplib ftp = ftblib.FTP("ftp.yourServer.com") ftp.login("username","password") filename = "index.html" ftp.storlines("STOR "+filename,open(filename

  • C#开发Windows服务实例之实现禁止QQ运行

    本实例主要实现下面三个基本功能 1.C#开发windows服务 2.禁止QQ等程序运行 3.为windows服务创建自动安装程序 下面针对这三个基本功能进行实现 一.C#开发windows服务 Windows服务在VS以前的版本中叫NT服务,在VS.NET启用了新的名称.用C#创建windows服务不是一件困难的事,下页针对服务创建.启动.停止做详细介绍 1.首先在vs中添加一winform程序KillService 2.在解决方案添加新项中添加Windows服务 3.打开服务页面,切换至代码页

  • Windows Server 2019 WEB和FTP服务器的配置方法

    Windows Server 2019 WEB和FTP服务器配置 1:添加新角色:WEB.FTP服务 步骤2:添加网站 步骤3:访问网站进行测试 步骤4:添加FTP站点 步骤5:添加FTP站点测试 完成! 到此这篇关于Windows Server 2019 WEB和FTP服务器的配置方法的文章就介绍到这了,更多相关win2019 WEB和FTP服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • c# 在windows中操作IIS设置FTP服务器的示例

    什么是FTP FTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件.可以将 Internet 信息服务 (IIS) 配置为作为 FTP 服务器来运行. 这样,其他计算机便可以连接到服务器并将文件复制到服务器或者从服务器复制文件. 例如,如果您在自己的计算机上承载网站,并且希望允许远程用户连接到您的计算机并将他们的文件复制到服务器,则可以将 IIS 配置为充当 FTP 服务器. 主要实现方式 下面主要讲解一下,在Window的I

  • python实现从ftp上下载文件的实例方法

    python从ftp上下载文件的方法: 首先导入ftp模块: 然后使用[chdir]命令切换工作路径: 再使用"self.ftp.nlst()"命令获取目录下的文件: 最后使用"self.ftp.retrbinary()"命令下载ftp文件即可. #!/usr/bin/python # coding=utf-8 import os from ftplib import FTP # 引入ftp模块 class MyFtp: ftp = FTP() def __init

  • ftp服务器PDF文件在线查看的实现方法

    URL形式: // http://localhost:2692/PDFVIEWER/web/viewer.html?file=http://localhost:2692/TOV/DASystem/GetStreaem?path%3Dftp://ftp账号:ftp密码@IP地址/0001/E_File3/2017526/test.PDF 注意:PDFVIEWER/web/viewer.html是一个PDF插件地址链接 后台方法,将ftp服务器上的PDF文件转成二进制流进行读取 using Syst

  • Python实现连接FTP并下载文件夹

    目录 第一章:连接FTP服务器并实现文件夹下载 ①连接FTP服务器 ②进入指定目录并显示文件信息 ③区分文件和文件夹名 ④文件夹名包含空格处理 ⑤使用递归实现:FTP服务器里的文件夹下载到本地 第二章:问题解决 第一章:连接 FTP 服务器并实现文件夹下载 ① 连接 FTP 服务器 如果 FTP 不用用户名密码就直接可以访问,那就是用的默认用户名 Anonymous,密码为空. # -*- coding: UTF8 -*- # 2022-3-8 # 作者:小蓝枣 # python连接ftp服务器

  • Windows Azure VM上配置FTP服务器

    1.启用FTP服务 2.创建FTP登陆用户 3.创建FTP站点 4.在Portal上增加endpoints 5.配置防火墙允许在上面增加的endpoint 端口上进行通信 6.重启FTP服务 1.启用FTP服务 这应该很简单,以server 08 R2为例(我Azure vm的系统是这个),打开Server Manager,点击Add Roles,选择组件"Web Server (IIS)",并且在Role Services里面把FTP Server勾上,一步步往下点击安装就OK了 2

随机推荐