相棒(chatGPT)と共同作業でプログラミングスキルアップ!(その2、hosts変更プログラム(C#))-2
注意) このままで、テキストボックスブランク状態で削除ボタンを押すと、hosts内が空になってしまいます。入力チェックが全くありませんでした。
-3で修正記事を投稿します。
先に投稿した記事の続きです。
hosts について説明を全くやっていませんが、各自でWeb検索して調べてください。hostsが分かる人しかこのアプリの必要性は感じないと思います。
通常はTextエディッタで直接修正しますが面倒です。
前回投稿したchatGPTの回答そのままで動きましたね。
しかし、hostsへの追加しかできません。
実際は、修正や削除も必要です。
そこで、続いて、『chatGPT』に聞きました。
★あなた
教えて頂いたロジックは、hostsに追加するロジックですね。 これを、すでにあるホスト名のIPアドレスを変更したり、ホスト名を指定して削除する機能を追加してください。
ChatGPT
ChatGPT
既存のホスト名のIPアドレスを変更したり、ホスト名を指定して削除する機能を追加するためのC# Windows フォームアプリケーションの完全なサンプルを以下に示します。
プロジェクトの作成
プロジェクトの作成:
Visual Studio を開き、新しい Windows フォームアプリケーションプロジェクトを作成します。
フォームのデザイン:
フォームに以下のコントロールを追加します:
テキストボックス (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
は、省略します。
これもまた、回答通りコピペして動作しました。
これに終了ボタンを追加して使えるアプリが完成しました。
ModifyHostsFile((lines, newEntry) =>
{・・・・}
こんなロジックは私のレベルではとても作れません。
linqは少しは知っていましたが、こんな使い方はできませんでした。
その他にも、chatGPTが無いころはとても作れなかったロジックがいっぱいあります。
『chatGPT』はプログラミングには正に神です。