C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

外部アプリケーションを起動させる1連の流れについて

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■100238 / inTopicNo.1)  外部アプリケーションを起動させる1連の流れについて
  
□投稿者/ 河童 (23回)-(2022/07/12(Tue) 18:45:04)

分類:[C#] 

VS2019 C# .net framework4 フォームアプリを作成しています。

メインPGを起動する前に更新PGを起動させてファイルコピーを実行させています。
メインPGも更新対象となるので、別々にPGを作成しています。

やりたいことは、この一連の処理をより良くしたいです。
皆様にアドバイスいただきたいです。

処理の流れは、
1.FileCopy.exe 起動
2.ファイル更新判定
 コピー元にアクセスできるか
3.ファイル更新実行
 フォルダのファイルをコピー
4.Main.exe 起動
 起動後にFileCopy.exeを終了
 エラー発生時更新ができていなくてもMain.exeは起動させる

教えていただきたいことがいくつかあります。
1.FileCopy.exe の起動の仕方
 フォーム画面を表示させています。
 そしてその画面にあるボタンをクリックするとファイル更新が実行されます。
 
 できればFileCopy.exeの起動画面は表示させたくありません。
 ショートカットアイコンからPGを起動したとき、フォーム画面を非表示で起動させる方法があれば教えてください。
 フォームのVisible と Hide を設定するとフォームは非表示になるのですが、ファイル更新が実行されません。

2.FileCopy.exe を終了させるタイミング
 ファイル更新が実行された後にMain.exe を起動させ、FileCopy.exe を終了させたいです。
 ファイル更新がエラーの時でもMain.exe は起動させたいです。
 
 今は、Main.exe を起動させて5秒間待機させていますが、
 起動したタイミングを検知してすぐにFileCopy.exe を終了させる方法はありますか? 
 
よろしくお願いいたします。 

	public F00_CopyStart()
        {
            InitializeComponent();

	}

        private void F00_CopyStart_Shown(object sender, EventArgs e)
        {
   
            // 最前面表示
            this.BringToFront();

            //// 非表示設定
            //Visible = false;
        }

        private void F00_CopyStart_Activated(object sender, EventArgs e)
        {
            //this.Hide();
        }

        private void btnCopy_Click(object sender, EventArgs e)
        {
          
            try
            {

                string CopyFldName = "コピー元のフォルダー";
                string PasteFldName = "コピー先のフォルダー";

                // 更新フォルダ確認(ファイルの有無)
                if (!Directory.EnumerateFileSystemEntries(CopyFldName).Any())
                {
                    //MessageBox.Show("更新ファイルはありません");

                    Main_Start()
                    Application.Exit();
                    return;
                }

                // ファイル更新実行
                if (Set_CopyDirectory(CopyFldName, PasteFldName))
                {
                    // 更新終了(正常)
                    //MessageBox.Show("更新終了しました");
                }

                Main_Start();
                Application.Exit();

            }
            catch (System.Exception ex)
            {
                //MessageBox.Show("エラーが発生");
                Main_Start();
                Application.Exit();
            }
        }

        private void Main_Start()
        {
            var proc = new System.Diagnostics.Process();
            proc.StartInfo.FileName = @"C:\Test\Main.exe";
            proc.Start();
            // 5秒待機
            proc.WaitForExit(5000);

            // 起動しているか確認する
            if (proc.HasExited)
            {
                MessageBox.Show("終了しました。");
            }
            else
            {
                MessageBox.Show("終了していません。");
            }

            MessageBox.Show("終了しました");
        }

引用返信 編集キー/
■100243 / inTopicNo.2)  Re[1]: 外部アプリケーションを起動させる1連の流れについて
□投稿者/ KOZ (286回)-(2022/07/12(Tue) 20:20:12)
No100238 (河童 さん) に返信
> 処理の流れは、
> 1.FileCopy.exe 起動

FileCopy.exe ってどんなプログラムですか?自作のプログラム?

robocopy ってのが標準でついてますが、何かいい機能があるのでしょうか?

「robocopy」
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/robocopy

「Windowsの「robocopy」コマンドでフォルダをバックアップ/同期させる」
https://atmarkit.itmedia.co.jp/ait/articles/0704/20/news130.html

> 1.FileCopy.exe の起動の仕方
>  できればFileCopy.exeの起動画面は表示させたくありません。

ProcessStartInfo クラスを使った起動を行ってください。

「ProcessStartInfo クラス」
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.processstartinfo?view=netframework-4.0

WindowStyle プロパティを ProcessWindowStyle.Hidden にすると
非表示で起動されます。

> 2.FileCopy.exe を終了させるタイミング
>  ファイル更新が実行された後にMain.exe を起動させ、FileCopy.exe を終了させたいです。
>  ファイル更新がエラーの時でもMain.exe は起動させたいです。

こちらは FileCopy.exe の仕様がわからないと何とも言えません。
更新が終わったら、そのまま画面を表示したままになってしまうのでしょうか?
終わったら終了するようにパラメータを与えたりできないですか?
更新が終わったら外部に通知する手段をもっていますか?

引用返信 編集キー/
■100244 / inTopicNo.3)  Re[2]: 外部アプリケーションを起動させる1連の流れについて
□投稿者/ くま (219回)-(2022/07/12(Tue) 21:46:54)
個人的にはFileCopy.exeはスタート画面として表示させた方が良いと思います。
あとFileCopy.exeはMain.exeを起動してるか確認しないで閉じたらいいだけのような気がしますが?
(リトライとか無しでしょ?)

引用返信 編集キー/
■100245 / inTopicNo.4)  Re[3]: 外部アプリケーションを起動させる1連の流れについて
□投稿者/ 河童 (24回)-(2022/07/13(Wed) 09:32:35)
No100244 (くま さん) に返信
> FileCopy.exe ってどんなプログラムですか?自作のプログラム?
FileCopy.exeは自作のプログラムです。
クラサバでMain.exe を利用していて、その更新ファイルを配布するのにFileCopy.exeを使用します。
FileCopy.exeは、Main.exeの起動前に共有フォルダ(更新ファイル保管場所)を確認して、
更新ファイルがあれば、ファイルコピーの処理を行います。
更新後は、Main.exeを起動させて、FileCopy.exeは終了します。

> 個人的にはFileCopy.exeはスタート画面として表示させた方が良いと思います。
そうですね。FileCopy.exeは非表示にしないで、スタート画面として表示させておきます。
画面の構成としては、ボタンなどは配置せずに「更新中」のメッセージを表示させます。
リトライはなくても良くて、最悪Main.exeを直接起動させます。

> 更新が終わったら、そのまま画面を表示したままになってしまうのでしょうか?
FileCopy.exeの画面が非表示になって、プロセスが残ったままの状態になります。
その時は更新処理やPG起動の処理は実行されていません。
非表示の設定を止めると、処理は正常に実行されます。

せっかく「ProcessStartInfo クラス」を教えていただいたのですが、
上記のようにスタート画面として表示させるようにします。

>> 2.FileCopy.exe を終了させるタイミング
>あとFileCopy.exeはMain.exeを起動してるか確認しないで閉じたらいいだけのような気がしますが?
FileCopy.exeがMain.exeを起動させて、確認しないで閉じることにします。
これも上記と同じように最悪Main.exeを直接起動させます。

>終わったら終了するようにパラメータを与えたりできないですか?
>更新が終わったら外部に通知する手段をもっていますか?
まだ未実装ですが、ログの出力は行いたいです。
  
引用返信 編集キー/
■100252 / inTopicNo.5)  Re[4]: 外部アプリケーションを起動させる1連の流れについて
□投稿者/ KOZ (287回)-(2022/07/13(Wed) 12:58:56)
No100245 (河童 さん) に返信
> FileCopy.exeは自作のプログラムです。
> クラサバでMain.exe を利用していて、その更新ファイルを配布するのにFileCopy.exeを使用します。
> FileCopy.exeは、Main.exeの起動前に共有フォルダ(更新ファイル保管場所)を確認して、
> 更新ファイルがあれば、ファイルコピーの処理を行います。
> 更新後は、Main.exeを起動させて、FileCopy.exeは終了します。

FileCopy.exe が Main.exe を起動するところまでやるのであれば、
No100238 のプログラムの役割は、FileCopy.exe を起動して自身を
終了することではないのでしょうか?
というか、FileCopy.exe を直接起動してもいいような気もしますね。

FileCopy.exe の終了を待つのであれば、Process.EnableRaisingEvents プロパティを
True にすると Exited イベントが発生するのでタイミングを捕まえられます。

「Process.EnableRaisingEvents プロパティ」
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process.enableraisingevents?view=netframework-4.0

「Process.Exited イベント」
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process.exited?view=netframework-4.0


引用返信 編集キー/
■100253 / inTopicNo.6)  Re[5]: 外部アプリケーションを起動させる1連の流れについて
□投稿者/ radian (72回)-(2022/07/13(Wed) 13:08:35)
No100252 (KOZ さん) に返信
> というか、FileCopy.exe を直接起動してもいいような気もしますね。

私が作るなら、多分そうしますね。
更新用のランチャープログラム + メインプログラムの構成は、割と良く見かけるパターンだと思います。
引用返信 編集キー/
■100254 / inTopicNo.7)  Re[6]: 外部アプリケーションを起動させる1連の流れについて
□投稿者/ kiku (280回)-(2022/07/13(Wed) 13:43:03)
No100253 (radian さん) に返信
> ■No100252 (KOZ さん) に返信
>>というか、FileCopy.exe を直接起動してもいいような気もしますね。
>
> 私が作るなら、多分そうしますね。
> 更新用のランチャープログラム + メインプログラムの構成は、割と良く見かけるパターンだと思います。

当方では下記のパターンのどちらかが多いです。
好みにもよりますし、ご要望仕様にもよるかなと思います。

@更新プログラム → メインプログラム
Aメインプログラム → バージョンアップボタン → 更新プログラム → メインプログラム
引用返信 編集キー/
■100256 / inTopicNo.8)  Re[7]: 外部アプリケーションを起動させる1連の流れについて
□投稿者/ 河童 (25回)-(2022/07/13(Wed) 14:41:31)
No100254 (kiku さん) に返信
No100253 (radian さん) に返信
No100252 (KOZ さん) に返信

皆様アドバイスありがとうございました。

今回の一連の処理は下記のようにしました。
1.FileCopy.exe 起動
  フォーム画面に「ファイル更新中」のメッセージを表示
2.ファイルコピー実行
3. コピー終了後、Main.exeを起動
4. FileCopy.exe 終了




解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ