プロジェクト

全般

プロフィール

統計
| リビジョン:

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
}