見出し画像

相棒(chatGPT)と共同作業でプログラミングスキルアップ!(その2、hosts変更プログラム(C#))-2

注意) このままで、テキストボックスブランク状態で削除ボタンを押すと、hosts内が空になってしまいます。入力チェックが全くありませんでした。
-3で修正記事を投稿します。

先に投稿した記事の続きです。
hosts について説明を全くやっていませんが、各自でWeb検索して調べてください。hostsが分かる人しかこのアプリの必要性は感じないと思います。
通常はTextエディッタで直接修正しますが面倒です。

前回投稿したchatGPTの回答そのままで動きましたね。

しかし、hostsへの追加しかできません。
実際は、修正や削除も必要です。
そこで、続いて、『chatGPT』に聞きました。

★あなた
教えて頂いたロジックは、hostsに追加するロジックですね。 これを、すでにあるホスト名のIPアドレスを変更したり、ホスト名を指定して削除する機能を追加してください。
ChatGPT
ChatGPT
既存のホスト名のIPアドレスを変更したり、ホスト名を指定して削除する機能を追加するためのC# Windows フォームアプリケーションの完全なサンプルを以下に示します。

プロジェクトの作成

  1. プロジェクトの作成:

    • Visual Studio を開き、新しい Windows フォームアプリケーションプロジェクトを作成します。

  2. フォームのデザイン:

    • フォームに以下のコントロールを追加します:

      • テキストボックス (IPアドレス入力用) (名前: textBoxIPAddress)

      • テキストボックス (ホスト名入力用) (名前: textBoxHostName)

      • ボタン (エントリ追加用) (名前: buttonAddEntry, テキスト: エントリを追加)

      • ボタン (エントリ削除用) (名前: buttonDeleteEntry, テキスト: エントリを削除)

      • ボタン (IPアドレス変更用) (名前: buttonUpdateEntry, テキスト: エントリを更新)

      • ラベル (IPアドレスラベル) (テキスト: IPアドレス:)

      • ラベル (ホスト名ラベル) (テキスト: ホスト名:)

      • ラベル (ステータスメッセージ表示用) (名前: labelStatus, テキスト: ステータスメッセージ)

フォームのコード

Form1.cs のコードビハインドに以下のコードを追加します。

csharp


using System;
using System.IO;
using System.Linq;
using System.Security.Principal;
using System.Windows.Forms;

namespace HostsFileEditor
{
    public partial class Form1 : Form
    {
        private readonly string hostsPath;

        public Form1()
        {
            InitializeComponent();
            hostsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), @"drivers\etc\hosts");
        }

        private void buttonAddEntry_Click(object sender, EventArgs e)
        {
            ModifyHostsFile((lines, newEntry) =>
            {
                lines.Add(newEntry);
                return lines;
            });
        }

        private void buttonDeleteEntry_Click(object sender, EventArgs e)
        {
            ModifyHostsFile((lines, newEntry) =>
            {
                string hostName = textBoxHostName.Text;
                lines = lines.Where(line => !line.Contains(hostName)).ToList();
                return lines;
            });
        }

        private void buttonUpdateEntry_Click(object sender, EventArgs e)
        {
            ModifyHostsFile((lines, newEntry) =>
            {
                string hostName = textBoxHostName.Text;
                string newIPAddress = textBoxIPAddress.Text;
                lines = lines.Select(line =>
                {
                    if (line.Contains(hostName))
                    {
                        string[] parts = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                        if (parts.Length >= 2 && parts[1] == hostName)
                        {
                            return $"{newIPAddress}\t{hostName}";
                        }
                    }
                    return line;
                }).ToList();
                return lines;
            });
        }

        private void ModifyHostsFile(Func<System.Collections.Generic.List<string>, string, System.Collections.Generic.List<string>> modifyAction)
        {
            if (!IsAdministrator())
            {
                MessageBox.Show("このプログラムは管理者権限で実行する必要があります。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            try
            {
                string ipAddress = textBoxIPAddress.Text;
                string hostName = textBoxHostName.Text;
                string newEntry = $"{ipAddress}\t{hostName}";

                var lines = File.ReadAllLines(hostsPath).ToList();
                lines = modifyAction(lines, newEntry);
                File.WriteAllLines(hostsPath, lines);

                labelStatus.Text = "操作が成功しました。";
            }
            catch (Exception ex)
            {
                labelStatus.Text = $"エラーが発生しました: {ex.Message}";
            }
        }

        private bool IsAdministrator()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
    }
}


フォームの InitializeComponent メソッド

Form1.Designer.cs に次のコードを追加してフォームのデザインを設定します:。
ここは Visual Studio のデザイナーで作成するので、chatGPT の回答は不使用です。

csharp
Form1.Designer.cs
は、省略します。

これもまた、回答通りコピペして動作しました。

これに終了ボタンを追加して使えるアプリが完成しました。

削除、修正、終了ボタンを追加したGUIの画面です
ModifyHostsFile((lines, newEntry) =>
            {・・・・}

こんなロジックは私のレベルではとても作れません。
linqは少しは知っていましたが、こんな使い方はできませんでした。
その他にも、chatGPTが無いころはとても作れなかったロジックがいっぱいあります。
『chatGPT』はプログラミングには正に神です。


いいなと思ったら応援しよう!