最近在做一个每天定点从FTP自动下载节目.xml并更新到数据库的功能。首先想到用 FileSystemWatcher来监控下载到某个目录中的文件是否发生改变,如果改变就执行相应的操作,然后用timer来设置隔多长时间来下载。后来又想想,用windwos服务来实现。
效果图:
执行的Log日志:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40INFO-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 然后项目中参照引用
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213using 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:HelloUpLoadImgChannelTvXML"); 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:HelloUpLoadImgChannelTvXML", 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:HelloUpLoadImgChannelTvXML" + 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:HelloUpLoadImgChannelLogDownTvList_" + 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 + "rn"); sw.Flush(); sw.Close(); } } catch (Exception ex) { ex.ToString(); } } } }
实现从FTP下载文件方法
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56/// <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服务就不多介绍了。如下图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持靠谱客。
最后
以上就是寒冷大船最近收集整理的关于C#开发windows服务实现自动从FTP服务器下载文件的全部内容,更多相关C#开发windows服务实现自动从FTP服务器下载文件内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复