h-you / trunk / src / UpDateCopy / UpDateCopy / FrmCopy.cs @ 485
履歴 | 表示 | アノテート | ダウンロード (21.8 KB)
1 |
using System; |
---|---|
2 |
using System.Collections; |
3 |
using System.Collections.Generic; |
4 |
using System.ComponentModel; |
5 |
using System.Data; |
6 |
using System.Diagnostics; |
7 |
using System.Drawing; |
8 |
using System.IO; |
9 |
using System.Linq; |
10 |
using System.Security.Cryptography; |
11 |
using System.Text; |
12 |
using System.Threading.Tasks; |
13 |
using System.Windows.Forms; |
14 |
using System.IO.Compression; |
15 |
|
16 |
namespace UpDateCopy |
17 |
{ |
18 |
public partial class FrmCopy : Form |
19 |
{ |
20 |
#region 定数 |
21 |
|
22 |
/// <summary> |
23 |
/// コピー元パス |
24 |
/// </summary> |
25 |
private static string s_SrcPath = string.Format(@"{0}{1}", Path.GetTempPath(), ClsCommon.s_HONTAI_MODULE); |
26 |
|
27 |
/// <summary> |
28 |
/// コピー元パス |
29 |
/// </summary> |
30 |
private static string s_DestPath = System.Environment.CurrentDirectory; |
31 |
#endregion |
32 |
|
33 |
#region 変数 |
34 |
|
35 |
/// <summary> |
36 |
/// クリエイトフォルダ一覧リスト |
37 |
/// </summary> |
38 |
private List<string> m_CreateFolderList = new List<string>(); |
39 |
|
40 |
/// <summary> |
41 |
/// コピーファイル一覧リスト |
42 |
/// </summary> |
43 |
private List<string> m_CopyFileList = new List<string>(); |
44 |
#endregion |
45 |
|
46 |
#region スレッド使用定義 |
47 |
|
48 |
/// <summary> |
49 |
/// コントロールの値を変更するためのデリゲート |
50 |
/// </summary> |
51 |
/// <param name="num"></param> |
52 |
private delegate void SetProgressValueDelegate(int num); |
53 |
private delegate void SetProgressMaxDelegate(); |
54 |
|
55 |
/// <summary> |
56 |
/// バックグラウンド処理が終わった時にコントロールの値を変更するためのデリゲート |
57 |
/// </summary> |
58 |
private delegate void ThreadCompletedDelegate(); |
59 |
|
60 |
/// <summary> |
61 |
/// 別処理をするためのスレッド |
62 |
/// </summary> |
63 |
private System.Threading.Thread workerThread; |
64 |
|
65 |
/// <summary> |
66 |
/// デリゲートの作成 |
67 |
/// </summary> |
68 |
SetProgressValueDelegate m_progressDlg = null; |
69 |
SetProgressMaxDelegate m_progressEnd = null; |
70 |
ThreadCompletedDelegate m_completeDlg = null; |
71 |
|
72 |
/// <summary> |
73 |
/// プログレスバー使用カウント |
74 |
/// </summary> |
75 |
private int m_ProgressCount = 0; |
76 |
#endregion |
77 |
|
78 |
#region コンストラクタ |
79 |
public FrmCopy() |
80 |
{ |
81 |
InitializeComponent(); |
82 |
} |
83 |
#endregion |
84 |
|
85 |
#region 画面ロード |
86 |
/// <summary> |
87 |
/// 画面ロード |
88 |
/// </summary> |
89 |
/// <param name="sender"></param> |
90 |
/// <param name="e"></param> |
91 |
private void FrmCopy_Load(object sender, EventArgs e) |
92 |
{ |
93 |
try |
94 |
{ |
95 |
// バージョン情報を取得する |
96 |
lblVersion.Text = string.Format("Version.{0}", ClsCommon.ProductVersionInfo.ProductVersion); |
97 |
|
98 |
if (File.Exists(ClsCommon.s_DefinitionFileName)) |
99 |
{ |
100 |
// 定義ファイル読込 |
101 |
ClsCommon.DefinitionFileInit(); |
102 |
|
103 |
// FTP接続情報作成 |
104 |
ClsCommon.m_FTP_USER_NAME = ClsCommon.m_DFRModel.FTPConnect.FTPUser; |
105 |
ClsCommon.m_FTP_PASSWORD = ClsCommon.m_DFRModel.FTPConnect.FTPPassword; |
106 |
ClsCommon.m_FTP_SERVER_PATH = ClsCommon.m_DFRModel.FTPConnect.FTPServer; |
107 |
} |
108 |
else |
109 |
{ |
110 |
// FTP接続情報作成 |
111 |
ClsCommon.m_FTP_USER_NAME = ClsCommon.s_FTP_USER_NAME; |
112 |
ClsCommon.m_FTP_PASSWORD = ClsCommon.s_FTP_PASSWORD; |
113 |
ClsCommon.m_FTP_SERVER_PATH = ClsCommon.s_FTP_SERVER_PATH; |
114 |
} |
115 |
} |
116 |
catch (Exception ex) |
117 |
{ |
118 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
119 |
} |
120 |
} |
121 |
#endregion |
122 |
|
123 |
#region フォームクローズ処理 |
124 |
/// <summary> |
125 |
/// フォームクローズ処理 |
126 |
/// </summary> |
127 |
/// <param name="sender"></param> |
128 |
/// <param name="e"></param> |
129 |
private void FrmCopy_FormClosing(object sender, FormClosingEventArgs e) |
130 |
{ |
131 |
// 終了処理 |
132 |
TermProcess(); |
133 |
} |
134 |
#endregion |
135 |
|
136 |
#region 終了処理 |
137 |
/// <summary> |
138 |
/// 終了処理 |
139 |
/// </summary> |
140 |
private void TermProcess() |
141 |
{ |
142 |
try |
143 |
{ |
144 |
// ターゲットを起動する |
145 |
string ExecProc = System.Environment.CurrentDirectory + "\\" + ClsCommon.s_TargetProcess + ".exe"; |
146 |
//logger.ErrorFormat("{0}:起動プログラム:{1}", this.Name, ExecProc); |
147 |
// ▼自動更新VPS対応▼ |
148 |
// 起動パラメータつきで起動する |
149 |
Process exec = Process.Start(ExecProc, ClsCommon.s_KIDOU_PARAM); |
150 |
// Process exec = Process.Start(ExecProc); |
151 |
// ▲自動更新VPS対応▲ |
152 |
} |
153 |
catch (Exception ex) |
154 |
{ |
155 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
156 |
} |
157 |
} |
158 |
#endregion |
159 |
|
160 |
#region 工程管理の終了を待ってコピーする |
161 |
/// <summary> |
162 |
/// 工程管理の終了を待ってコピーする |
163 |
/// </summary> |
164 |
/// <param name="sender"></param> |
165 |
/// <param name="e"></param> |
166 |
private void FrmCopy_Shown(object sender, EventArgs e) |
167 |
{ |
168 |
try |
169 |
{ |
170 |
// コマンドライン引数を取る |
171 |
string[] cmds = Environment.GetCommandLineArgs(); |
172 |
|
173 |
lblMessage.Text = ClsCommon.s_TargetProcess + "を更新しています。\nそのまましばらくお待ちください。"; |
174 |
lblMessage.Refresh(); |
175 |
|
176 |
// ▼自動更新VPS対応▼ |
177 |
System.Threading.Thread.Sleep(1000); |
178 |
|
179 |
string tempPath = Path.GetTempPath(); |
180 |
// アップデートファイルパス |
181 |
string updateFilePath = string.Format("{0}{1}", tempPath, ClsCommon.s_HONTAI_MODULE); |
182 |
// サーバ更新モジュールzipファイル(ダウンロード後) |
183 |
string updateModuleZip = string.Format("{0}.zip", updateFilePath); |
184 |
|
185 |
// 「現場監督秘書(本体)zipの展開フォルダが存在するかチェック |
186 |
if (System.IO.Directory.Exists(updateFilePath)) |
187 |
{ |
188 |
// zip削除 |
189 |
System.IO.File.Delete(updateModuleZip); |
190 |
// ダウンロードファイル削除 |
191 |
System.IO.Directory.Delete(updateFilePath, true); |
192 |
} |
193 |
|
194 |
// 「現場監督秘書(本体)zipダウンロード |
195 |
string strServerPath = string.Format("{0}{1}.zip", ClsCommon.m_FTP_SERVER_PATH, ClsCommon.s_HONTAI_MODULE); |
196 |
Download(strServerPath, updateModuleZip); |
197 |
|
198 |
// ダウンロードした「現場監督秘書(本体)zip解凍 |
199 |
ZipFile.ExtractToDirectory(updateModuleZip, tempPath); |
200 |
// ▲自動更新VPS対応▲ |
201 |
|
202 |
// プログレスバー初期設定 |
203 |
string[] files = Directory.GetFiles(s_SrcPath); |
204 |
progressBar.Visible = true; |
205 |
progressBar.Minimum = 0; |
206 |
progressBar.Maximum = Directory.GetFiles(s_SrcPath, "*", SearchOption.AllDirectories).Length; |
207 |
progressBar.Value = 0; |
208 |
|
209 |
// メインプログラムの終了を待つ |
210 |
while (true) |
211 |
{ |
212 |
bool Aliveflg = false; |
213 |
int cnt = 0; |
214 |
Process[] processList = Process.GetProcesses(); |
215 |
foreach (Process p in processList) |
216 |
{ |
217 |
Aliveflg = false; |
218 |
if (p.ProcessName == ClsCommon.s_TargetProcess) |
219 |
{ |
220 |
if (p.Responding) |
221 |
{ |
222 |
Aliveflg = true; |
223 |
Console.WriteLine("OK"); |
224 |
break; |
225 |
} |
226 |
} |
227 |
Debug.WriteLine(++cnt + ":" + p.ProcessName); |
228 |
} |
229 |
if (!Aliveflg) break; |
230 |
System.Threading.Thread.Sleep(1000); |
231 |
} |
232 |
|
233 |
System.Threading.Thread.Sleep(1000); |
234 |
|
235 |
// ファイルコピー |
236 |
CopyFileProcess(); |
237 |
} |
238 |
catch (Exception ex) |
239 |
{ |
240 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
241 |
this.Close(); |
242 |
} |
243 |
} |
244 |
#endregion |
245 |
|
246 |
#region ファイルコピーメイン |
247 |
/// <summary> |
248 |
/// ファイルコピーメイン |
249 |
/// </summary> |
250 |
/// <param name="dir"></param> |
251 |
private void CopyFileProcess() |
252 |
{ |
253 |
try |
254 |
{ |
255 |
lblMessage.Text = ClsCommon.s_TargetProcess + "を更新しています。\nそのまましばらくお待ちください。"; |
256 |
lblMessage.Refresh(); |
257 |
|
258 |
//印刷を別スレッドで実行する |
259 |
m_ProgressCount = 0; |
260 |
workerThread = new System.Threading.Thread(new System.Threading.ThreadStart(DoWork)); |
261 |
workerThread.IsBackground = true; |
262 |
workerThread.Start(); |
263 |
|
264 |
} |
265 |
catch (Exception ex) |
266 |
{ |
267 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
268 |
} |
269 |
} |
270 |
#endregion |
271 |
|
272 |
#region サーバからファイルダウンロード |
273 |
// ▼自動更新VPS対応▼ |
274 |
/// <summary> |
275 |
/// サーバからファイルダウンロード |
276 |
/// </summary> |
277 |
/// <param name="serverPath"></param> |
278 |
/// <param name="downloadSakiPath"></param> |
279 |
private static void Download(String serverPath, String downloadSakiPath) |
280 |
{ |
281 |
//WebClientオブジェクトを作成 |
282 |
System.Net.WebClient wc = new System.Net.WebClient(); |
283 |
try |
284 |
{ |
285 |
//ログインユーザー名とパスワードを指定 |
286 |
wc.Credentials = |
287 |
new System.Net.NetworkCredential(ClsCommon.m_FTP_USER_NAME, ClsCommon.m_FTP_PASSWORD); |
288 |
//FTPサーバーからダウンロードする |
289 |
wc.DownloadFile(serverPath, downloadSakiPath); |
290 |
} |
291 |
catch (Exception ex) |
292 |
{ |
293 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
294 |
} |
295 |
finally |
296 |
{ |
297 |
//解放する |
298 |
wc.Dispose(); |
299 |
} |
300 |
} |
301 |
// ▲自動更新VPS対応t▲ |
302 |
#endregion |
303 |
|
304 |
#region スレッドメインプロセス |
305 |
/// <summary> |
306 |
/// スレッドメインプロセス |
307 |
/// </summary> |
308 |
/// <param name="sender"></param> |
309 |
/// <param name="e"></param> |
310 |
public void DoWork() |
311 |
{ |
312 |
// ----- ここで時間のかかる処理を行う |
313 |
try |
314 |
{ |
315 |
//デリゲートの作成 |
316 |
m_progressDlg = new SetProgressValueDelegate(SetProgressValue); |
317 |
m_progressEnd = new SetProgressMaxDelegate(SetProgressMax); |
318 |
m_completeDlg = new ThreadCompletedDelegate(ThreadCompleted); |
319 |
|
320 |
// ファイルコピー |
321 |
CopyDirectory(s_SrcPath, s_DestPath); |
322 |
|
323 |
// 完了したときにコントロールの値を変更する |
324 |
this.Invoke(m_progressEnd); |
325 |
} |
326 |
catch (Exception ex) |
327 |
{ |
328 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
329 |
} |
330 |
finally |
331 |
{ |
332 |
// 終了処理 |
333 |
this.Invoke(m_completeDlg); |
334 |
|
335 |
//デリゲートの廃棄 |
336 |
m_progressDlg = null; |
337 |
m_progressEnd = null; |
338 |
m_completeDlg = null; |
339 |
|
340 |
// ガーベージコレクト |
341 |
GC.Collect(); |
342 |
} |
343 |
} |
344 |
#endregion |
345 |
|
346 |
#region ファイルをディレクトリごとコピーする |
347 |
/// <summary> |
348 |
/// ファイルをディレクトリごとコピーする |
349 |
/// </summary> |
350 |
/// <param name="srcDirName">コピーするディレクトリ</param> |
351 |
/// <param name="destDirName">コピー先のディレクトリ</param> |
352 |
private void CopyDirectory(string srcDirName, string destDirName) |
353 |
{ |
354 |
try |
355 |
{ |
356 |
// コピー先のディレクトリがないときは作る |
357 |
if (!Directory.Exists(destDirName)) |
358 |
{ |
359 |
Directory.CreateDirectory(destDirName); |
360 |
// 属性もコピー |
361 |
File.SetAttributes(destDirName, File.GetAttributes(srcDirName)); |
362 |
} |
363 |
|
364 |
// コピー先のディレクトリ名の末尾に"\"をつける |
365 |
if (destDirName[destDirName.Length - 1] != Path.DirectorySeparatorChar) |
366 |
{ |
367 |
destDirName = destDirName + Path.DirectorySeparatorChar; |
368 |
} |
369 |
|
370 |
string strMyProcess = string.Format("{0}.exe", Process.GetCurrentProcess().ProcessName); |
371 |
// コピー元のディレクトリにあるファイルをコピー |
372 |
string[] files = Directory.GetFiles(srcDirName); |
373 |
foreach (string f in files) |
374 |
{ |
375 |
// プログレスバー加算 |
376 |
this.Invoke(m_progressDlg, new object[] { ++m_ProgressCount }); |
377 |
|
378 |
// 自分は処理しない |
379 |
if (Path.GetFileName(f).IndexOf(strMyProcess) > -1) continue; |
380 |
|
381 |
string destFileName = string.Format(@"{0}\{1}", destDirName, Path.GetFileName(f)); |
382 |
|
383 |
// コピー先にファイルが存在する、またはコピー先のファイルが新しい場合はコピーしない |
384 |
if (File.Exists(destFileName) && CompareFileDifference(f, destFileName)) continue; |
385 |
|
386 |
File.Copy(f, destFileName, true); |
387 |
} |
388 |
|
389 |
// コピー先にあってコピー元にないファイルを削除 |
390 |
//DeleteNotExistFiles(srcDirName, destDirName); |
391 |
|
392 |
// コピー元のディレクトリにあるディレクトリについて、再帰的に呼び出す |
393 |
string[] dirs = Directory.GetDirectories(srcDirName); |
394 |
foreach (string dir in dirs) |
395 |
{ |
396 |
CopyDirectory(dir, destDirName + Path.GetFileName(dir)); |
397 |
} |
398 |
} |
399 |
catch (Exception ex) |
400 |
{ |
401 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
402 |
} |
403 |
} |
404 |
#endregion |
405 |
|
406 |
#region ファイルのタイムスタンプを比較する |
407 |
/// <summary> |
408 |
/// ファイルのタイムスタンプを比較する |
409 |
/// </summary> |
410 |
/// <param name="srcHash">コピー元ファイル</param> |
411 |
/// <param name="destHash">コピー先ファイル</param> |
412 |
/// <returns></returns> |
413 |
private bool CompareFileDifference(string SrcFile, string DestFile) |
414 |
{ |
415 |
try |
416 |
{ |
417 |
// ハッシュ値を取得する |
418 |
// ----- コピー元ファイル |
419 |
string srcHash = ClsCommon.GetFileHashData(@SrcFile); |
420 |
// ----- コピー先ファイル |
421 |
string destHash = ClsCommon.GetFileHashData(@DestFile); |
422 |
|
423 |
// ファイルが同じ |
424 |
if (srcHash == destHash) return true; |
425 |
|
426 |
// 更新時間を確認する |
427 |
// ----- コピー元ファイル |
428 |
DateTime srcTimeStamp = ClsCommon.GetFileTimeStamp(SrcFile, 'U'); |
429 |
// ----- コピー先ファイル |
430 |
DateTime destTimeStamp = ClsCommon.GetFileTimeStamp(DestFile, 'U'); |
431 |
|
432 |
// コピー元ファイルが新しくない |
433 |
if (srcTimeStamp <= destTimeStamp) return true; |
434 |
|
435 |
return false; |
436 |
} |
437 |
catch (Exception ex) |
438 |
{ |
439 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
440 |
return true; |
441 |
} |
442 |
} |
443 |
#endregion |
444 |
|
445 |
#region コピー先にありコピー元にないファイルを削除する |
446 |
/// <summary> |
447 |
/// コピー先にありコピー元にないファイルを削除する |
448 |
/// </summary> |
449 |
/// <param name="srcDirName">比較先のフォルダ</param> |
450 |
/// <param name="destDirName">比較もとのフォルダ</param> |
451 |
private void DeleteNotExistFiles(string srcDirName, string destDirName) |
452 |
{ |
453 |
try |
454 |
{ |
455 |
// sourceDirNameの末尾に"\"をつける |
456 |
if (srcDirName[srcDirName.Length - 1] != Path.DirectorySeparatorChar) |
457 |
{ |
458 |
srcDirName = srcDirName + Path.DirectorySeparatorChar; |
459 |
} |
460 |
|
461 |
string strMyProcess = Process.GetCurrentProcess().ProcessName; |
462 |
// destDirNameにありsourceDirNameにないファイルを削除する |
463 |
string[] files = Directory.GetFiles(destDirName); |
464 |
foreach (string f in files) |
465 |
{ |
466 |
string strFileName = Path.GetFileName(f); |
467 |
// 自プロセス関連ファイルを削除しない |
468 |
if (strFileName.IndexOf(strMyProcess) > -1) continue; |
469 |
|
470 |
string strSrcPath = string.Format("{0}{1}", srcDirName, strFileName); |
471 |
// ファイル存在確認 |
472 |
if (File.Exists(strSrcPath)) continue; |
473 |
|
474 |
// ファイル削除 |
475 |
File.Delete(f); |
476 |
} |
477 |
|
478 |
// destDirNameにありsourceDirNameにないフォルダを削除する |
479 |
string[] folders = Directory.GetDirectories(destDirName); |
480 |
foreach (string folder in folders) |
481 |
{ |
482 |
// フォルダ存在確認 |
483 |
if (Directory.Exists(srcDirName + Path.GetFileName(folder))) continue; |
484 |
|
485 |
// フォルダ削除 |
486 |
Directory.Delete(folder, true); |
487 |
} |
488 |
} |
489 |
catch (Exception ex) |
490 |
{ |
491 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
492 |
} |
493 |
} |
494 |
#endregion |
495 |
|
496 |
#region プロセス終了時ハンドラ |
497 |
/// <summary> |
498 |
/// プロセス終了時ハンドラ |
499 |
/// </summary> |
500 |
/// <param name="sender"></param> |
501 |
/// <param name="e"></param> |
502 |
private void ThreadCompleted() |
503 |
{ |
504 |
// ----- 処理が終わったときに呼び出される |
505 |
try |
506 |
{ |
507 |
string tempPath = Path.GetTempPath(); |
508 |
// zip削除 |
509 |
string strZipFile = tempPath + ClsCommon.s_HONTAI_MODULE + ".zip"; |
510 |
if (File.Exists(strZipFile)) System.IO.File.Delete(strZipFile); |
511 |
|
512 |
// ダウンロードファイル削除 |
513 |
string strDownLoad = tempPath + ClsCommon.s_HONTAI_MODULE; |
514 |
if (Directory.Exists(strDownLoad)) System.IO.Directory.Delete(strDownLoad, true); |
515 |
} |
516 |
catch (Exception ex) |
517 |
{ |
518 |
ClsCommon.ErrorLogWrite(string.Format("システムエラー:{0}:{1}", ClsCommon.GetMethodName(), ex.Message.ToString())); |
519 |
} |
520 |
finally |
521 |
{ |
522 |
this.Close(); |
523 |
Application.Exit(); |
524 |
} |
525 |
} |
526 |
#endregion |
527 |
|
528 |
#region プログレスバーの値を変更する |
529 |
/// <summary> |
530 |
/// プログレスバーの値を変更する |
531 |
/// </summary> |
532 |
/// <param name="num"></param> |
533 |
private void SetProgressValue(int num) |
534 |
{ |
535 |
// ProgressBarの値を変更する |
536 |
progressBar.Value = num; |
537 |
progressBar.Update(); |
538 |
if ((num % 2) == 0) |
539 |
System.Threading.Thread.Sleep(10); |
540 |
} |
541 |
#endregion |
542 |
|
543 |
#region プログレスバーの最終値に変更する |
544 |
/// <summary> |
545 |
/// プログレスバーの最終値に変更する |
546 |
/// </summary> |
547 |
/// <param name="num"></param> |
548 |
private void SetProgressMax() |
549 |
{ |
550 |
// ProgressBarの値を変更する |
551 |
progressBar.Value = progressBar.Maximum; |
552 |
progressBar.Update(); |
553 |
System.Threading.Thread.Sleep(500); |
554 |
} |
555 |
#endregion |
556 |
} |
557 |
} |