プロジェクト

全般

プロフィール

統計
| リビジョン:

h-you / branches / src / UpDateCopy / FrmCopy.cs @ 70

履歴 | 表示 | アノテート | ダウンロード (10.2 KB)

1 70 bit
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
21
        // コピー一覧リスト
22
        private static List<string> m_CopyList = new List<string>();
23
24
        #region コンストラクタ
25
        public FrmCopy()
26
        {
27
            InitializeComponent();
28
        }
29
        #endregion
30
31
        /// <summary>
32
        /// 画面ロード
33
        /// </summary>
34
        /// <param name="sender"></param>
35
        /// <param name="e"></param>
36
        private void FrmCopy_Load(object sender, EventArgs e)
37
        {
38
        }
39
40
        /// <summary>
41
        /// 工程管理の終了を待ってコピーする
42
        /// </summary>
43
        /// <param name="sender"></param>
44
        /// <param name="e"></param>
45
        private void FrmCopy_Shown(object sender, EventArgs e)
46
        {
47
            // コマンドライン引数を取る
48
            string[] cmds = Environment.GetCommandLineArgs();
49
50
            lblMessage.Text = ClsCommon.s_TargetProcess + "を更新しています。\nそのまましばらくお待ちください。";
51
            lblMessage.Refresh();
52
53
// ▼自動更新VPS対応▼
54
            System.Threading.Thread.Sleep(1000);
55
56
            string tempPath = Path.GetTempPath();
57
            // サーバ更新モジュールzipファイル(ダウンロード後)
58
            string updateModuleZip = tempPath + ClsCommon.s_HONTAI_MODULE + ".zip";
59
60
            // 「現場監督秘書(本体)zipの展開フォルダが存在するかチェック
61
            if (System.IO.Directory.Exists(tempPath + ClsCommon.s_HONTAI_MODULE)) {
62
                // zip削除
63
                System.IO.File.Delete(tempPath + ClsCommon.s_HONTAI_MODULE + ".zip");
64
                // ダウンロードファイル削除
65
                System.IO.Directory.Delete(tempPath + ClsCommon.s_HONTAI_MODULE, true);
66
            }
67
            // 「現場監督秘書(本体)zipダウンロード
68
            download(ClsCommon.s_FTP_SERVER_PATH + ClsCommon.s_HONTAI_MODULE + ".zip", updateModuleZip);
69
            // ダウンロードした「現場監督秘書(本体)zip解凍
70
            ZipFile.ExtractToDirectory(updateModuleZip, tempPath);
71
// ▲自動更新VPS対応▲
72
73
            // メインプログラムの終了を待つ
74
            while (true)
75
            {
76
                bool Aliveflg = false;
77
                int cnt = 0;
78
                Process[] processList = Process.GetProcesses();
79
                foreach (Process p in processList)
80
                {
81
                    Aliveflg = false;
82
                    if (p.ProcessName == ClsCommon.s_TargetProcess)
83
                    {
84
                        if (p.Responding)
85
                        {
86
                            Aliveflg = true;
87
                            Console.WriteLine("OK");
88
                            break;
89
                        }
90
                    }
91
                    Debug.WriteLine(++cnt + ":" + p.ProcessName);
92
                }
93
                if (!Aliveflg) break;
94
                System.Threading.Thread.Sleep(1000);
95
            }
96
97
            System.Threading.Thread.Sleep(1000);
98
99
            // ファイルコピー
100
            CopyFileProcess();
101
102
            this.Close();
103
            Application.Exit();
104
105
            // ターゲットを起動する
106
            string ExecProc = System.Environment.CurrentDirectory + "\\" + ClsCommon.s_TargetProcess + ".exe";
107
            //logger.ErrorFormat("{0}:起動プログラム:{1}", this.Name, ExecProc);
108
// ▼自動更新VPS対応▼
109
            // 起動パラメータつきで起動する
110
            Process exec = Process.Start(ExecProc, ClsCommon.s_KIDOU_PARAM);
111
//            Process exec = Process.Start(ExecProc);
112
// ▲自動更新VPS対応▲
113
114
        }
115
116
        /// <summary>
117
        /// ファイルコピーメイン
118
        /// </summary>
119
        /// <param name="dir"></param>
120
        private void CopyFileProcess()
121
        {
122
            try
123
            {
124
                // コピー対象を検索する
125
                CreateCopyList();
126
                // コピー対象が無ければ処理終了
127
                if (m_CopyList.Count == 0) return;
128
129
                lblMessage.Text = ClsCommon.s_TargetProcess + "を更新しています。\nそのまましばらくお待ちください。";
130
                lblMessage.Refresh();
131
132
                // プログレスバー設定
133
                progressBar.Minimum = 0;
134
                progressBar.Value = 0;
135
                // プログレスバーMAX設定
136
                progressBar.Maximum = m_CopyList.Count;
137
138
                // コピー先ファイル名
139
                string destinationPath = System.Environment.CurrentDirectory + @"\" ;
140
141
                // ファイルコピー
142
                for (int i = 0; i < m_CopyList.Count; i++)
143
                {
144
                    // ファイル名を取得する
145
                    int spoint = m_CopyList[i].LastIndexOf("\\") + 1;
146
                    string Procename = m_CopyList[i].Substring(spoint);
147
148
                    // コピー先ファイル名
149
                    string destinationFile = @destinationPath + Procename;
150
151
                    // ファイルコピー
152
                    File.Copy(@m_CopyList[i], @destinationFile, true);
153
                    ClsCommon.ErrorLogWrite(string.Format("{0}::{1}", @m_CopyList[i], @destinationFile));
154
                    // プログレスバー加算
155
                    progressBar.Value++;
156
                    progressBar.Refresh();
157
                }
158
                // プログレスバー加算
159
                progressBar.Value = progressBar.Maximum;
160
                progressBar.Refresh();
161
// ▼自動更新VPS対応▼
162
                string tempPath = Path.GetTempPath();
163
                // zip削除
164
                System.IO.File.Delete(tempPath + ClsCommon.s_HONTAI_MODULE + ".zip");
165
                // ダウンロードファイル削除
166
                System.IO.Directory.Delete(tempPath + ClsCommon.s_HONTAI_MODULE, true);
167
// ▲自動更新VPS対応▲
168
169
            }
170
            catch (Exception ex)
171
            {
172
                ClsCommon.ErrorLogWrite(ex.Message.ToString());
173
            }
174
        }
175
        /// <summary>
176
        /// コピーファイル一覧作成
177
        /// </summary>
178
        /// <param name="wrtString"></param>
179
        /// <returns></returns>
180
        private void CreateCopyList()
181
        {
182
183
            try
184
            {
185
                lblMessage.Text = ClsCommon.s_TargetProcess + "の更新を調査しています。\nそのまましばらくお待ちください。";
186
                lblMessage.Refresh();
187
188
                // 自プロセス名を作成する
189
                string myProcess = Process.GetCurrentProcess().ProcessName + ".exe";
190
191
// ▼自動更新VPS対応▼
192
                // コピー元ファイル名を取得する
193
//                string[] files = Directory.GetFiles(@ClsCommon.s_UPDATE_FILE_PATH);
194
                string[] files = Directory.GetFiles(Path.GetTempPath() + "\\" + ClsCommon.s_HONTAI_MODULE);
195
// ▲自動更新VPS対応▲
196
197
                foreach (string sourceFile in files)
198
                {
199
                    // ファイル名を取得する
200
                    int spoint = sourceFile.LastIndexOf("\\") + 1;
201
                    string ProgramName = sourceFile.Substring(spoint);
202
203
                    // 自分は処理しない
204
                    if (myProcess == ProgramName) continue;
205
206
                    // コピー先ファイル名
207
                    string destinationFile = System.Environment.CurrentDirectory + "\\" + ProgramName;
208
209
                    // ----- コピー先にファイルファイルがない
210
                    if (!File.Exists(@destinationFile))
211
                    {
212
                        m_CopyList.Add(@sourceFile);
213
                        continue;
214
                    }
215
216
                    // ハッシュ値を取得する
217
                    // ----- コピー元ファイル
218
                    string srcHash = ClsCommon.GetFileHashData(@sourceFile);
219
                    // ----- コピー先ファイル
220
                    string destHash = ClsCommon.GetFileHashData(@destinationFile);
221
222
                    // ファイルが違う
223
                    if (srcHash != destHash)
224
                    {
225
                        // 更新時間を確認する
226
                        // ----- コピー元ファイル
227
                        DateTime srcTimeStamp = ClsCommon.GetFileTimeStamp(@sourceFile, 'U');
228
                        // ----- コピー先ファイル
229
                        DateTime destTimeStamp = ClsCommon.GetFileTimeStamp(@destinationFile, 'U');
230
                        // コピー元ファイルが新しくない
231
                        if (srcTimeStamp <= destTimeStamp) continue;
232
233
                        m_CopyList.Add(@sourceFile);
234
                    }
235
                }
236
            }
237
            catch (Exception ex)
238
            {
239
                ClsCommon.ErrorLogWrite(ex.Message.ToString());
240
            }
241
        }
242
243
// ▼自動更新VPS対応▼
244
        // サーバからファイルダウンロード
245
        private static void download(String serverPath, String downloadSakiPath)
246
        {
247
            //WebClientオブジェクトを作成
248
            System.Net.WebClient wc = new System.Net.WebClient();
249
            //ログインユーザー名とパスワードを指定
250
            wc.Credentials =
251
                new System.Net.NetworkCredential(ClsCommon.s_FTP_USER_NAME, ClsCommon.s_FTP_PASSWORD);
252
            //FTPサーバーからダウンロードする
253
            wc.DownloadFile(serverPath, downloadSakiPath);
254
            //解放する
255
            wc.Dispose();
256
        }
257
// ▲自動更新VPS対応t▲
258
259
    }
260
}