ホリデープログラミング入門

ホリデーにプログラミングを楽しむための入門 by 船木信宏

C#

[ リスト | 詳細 ]

記事検索
検索

全1ページ

[1]


hosts を切り替えるWindowsアプリ その3


最終的なソースコードは以下のようになりました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;

namespace HostsSwitcher
{
public partial class HostsSwitcher : Form
{
const string ETC_HOSTS = "C:\\WINDOWS\\system32\\drivers\\etc\\hosts";
const string ETC_HOSTS_OFFICE = "C:\\WINDOWS\\system32\\drivers\\etc\\hosts_office.txt";
const string ETC_HOSTS_HOME = "C:\\WINDOWS\\system32\\drivers\\etc\\hosts_home.txt";
const string MESSAGE_COPY_OK = "コピーしました!";
const string MESSAGE_SOMETHINGWRONG = "何かよからぬことが起きました";

public HostsSwitcher()
{
InitializeComponent();
}

private void buttonOffice_Click(object sender, EventArgs e)
{
try
{
if (File.Exists(ETC_HOSTS))
{
File.Delete(ETC_HOSTS);
}
File.Copy(ETC_HOSTS_OFFICE, ETC_HOSTS);
MessageBox.Show(MESSAGE_COPY_OK);
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(MESSAGE_SOMETHINGWRONG);
}
}

private void other_Click(object sender, EventArgs e)
{
try
{
if (File.Exists(ETC_HOSTS))
{
File.Delete(ETC_HOSTS);
}
File.Copy(ETC_HOSTS_HOME, ETC_HOSTS);
MessageBox.Show(MESSAGE_COPY_OK);
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(MESSAGE_SOMETHINGWRONG);
}
}
}
}

File.Copy()はファイルを上書きしてくれないので、先にDeleteしています。Deleteはファイルがなくても例外を出さない、とあるのでExistsは不要か。

catchでExceptionを加えました。これで何か予期せぬ例外が発生しても一応エラーメッセージを出すことができます。これがないと突然落ちるアプリになってしまいます。

exeの配布を目的としたアプリではないので、これで終わりにしてしまいますがやるとしたら

・様々な環境での動作確認(hostsのパスの違い、.NETのバージョン etc)
・元々あったhostsファイルのバックアップ

辺りは必要かと思います。
hostsファイルを自動で編集するアプリが他にあるか未確認なので、上書きして何かのサイトにアクセスできなくなることがないよう、お気をつけください。


使い方


hosts_office.txtは「オフィス」、hosts_home.txtは「その他」ボタンを押したときにコピーされるhostsファイルです。これらをあらかじめ用意しておいて、必要になったときにHostsSwitcherを起動してボタンを押せば切り替わります。

Firefoxはhostsを反映させるには再起動が必要なようです。他のアプリも同様かもしれません。

VisualStudio2008の場合、マイドキュメントの下の
Visual Studio 2008\Projects\HostsSwitcher\HostsSwitcher\bin\Release
にHostsSwitcher.exeが生成されていました。

起動しやすいようにC:\WINDOWSにコピーしました。これでWindowsキー+Rで「ファイル名を指定して実行」でhostsswitcherと打てば起動できます。

まとめ


これでWindowsライフがちょっと便利になったような気がします。進化したVisualStudioの威力もちょこっとですが堪能できました。今回の.NETなC#なら無料でできるのでぜひWindowsアプリ開発も試してみてください。

追記:
こんなブログがありました。
Visual Studio 2008 ワンポイント (Sara Ford's Weblog)

さて先週の続きです。昨日今日とお花見日和ですが、出掛ける前にさくさくプログラミング。

プログラムの動きを考えながらコメントを書く


これは僕のやり方ですが、頭の中でプログラムがどう動くのか、イメージしつつソースコード中にコメントを書き散らかしていきます。

// 設定ファイルのパスは決め打ち?

とかとか。コードが書けてきたらコメントは消してしまいます。残しておくコメントはもう少し練ってから。

目印にXXXやTODOをコメントに添えたりもします。VisualStudioはそのままだと色が変わることはありませんが、XXXの部分の色を反転させたりすると目立ちますし、検索もしやすいので便利です。

ファイル操作


hostsを切り替える、というのは言い換えるとhostsファイルを別のファイルに置き換える、ということです。ファイルを書き込みモードで開いて、、などとせずとも

1.オフィス用hosts
2.hostsファイル自身

と2つ用意しておいて、1のファイルを2にコピーしてしまえば簡単。

C#ではどうすればいいのかな、とまずは検索。


「C#」で調べて入門っぽいサイトにアクセスしたらこのページが出てきました。まさにやりたいことは「ファイル操作」です。このページによると

using System.IO;
File.ほにゃらら
がファイル操作用のメソッド群のようです。

ここからはVisualStudioの威力発揮。Form1.csを開いて「オフィス」ボタンをダブルクリック。Form1.csのソースが出てくるのでusing System.IO;を上の方に記述。続いてbutton1_Click()の中でFile.と打ち込んでいきます。すると、ドットを打った直後にリストになって次に入力可能なメソッドが出てきます。アルファベット順に並んでいるのでCopyが上の方に目に付くと思います。これを上下キーを移動させて選択。

丁寧にメソッドの説明も出てきます。必要な引数もばっちり。
引数に与える値は決め打ちにしてしまいました。固定した値なので変数ではなく定数として定義。


文字列なので
const string ETC_HOSTS = "C:\\WINDOWS\\system32\\drivers\\etc\\hosts";
const string ETC_HOSTS_OFFICE = "C:\\WINDOWS\\system32\\drivers\\etc\\hosts_office.txt";
こんな感じ。バックスラッシュ(円マーク)は2つ続けてエスケープしておきます。

VisualStudio2008の新機能に感動した!


たぶん2008の新機能だと思うのですが、1つとても感動しました。
まず、コードがそれなりに書けたので正しいことを確認するためにF6を押してコンパイル。無事通るようになってからF5を押して実行。ウィンドウが開きます。

で、「オフィス」のボタンを押すと、先ほどのFile.Copyが実行されるはずですがちょっと考えるとETC_HOSTS_OFFICEのファイルがまだありません。PHPの場合だと単にWarningが出ます。
Warning: copy(hoge): failed to open stream: No such file or directory in /home/funaki/- on line 2

C#はどうなるでしょうか。VisualStudioにこんな画面が登場しました。
http://zuzara.com/pub/hostsswitcher_exception.png

僕は感動しました!
エラーが起きた箇所を教えてくれるだけでなくFileNotFoundExceptionという「例外」がハンドルされなかったこと、hosts_office.txtが見つからなかったこと、それらを解決する上でのヒントが表示されています。

ここからは知らないとできませんが、例外をハンドルするにはtry/catchを使います。
try
{
File.Copy(ETC_HOSTS_OFFICE, ETC_HOSTS);
}
catch (FileNotFoundException ex)
{
MessageBox.Show(ex.Message);
}
このようにCopyをtry/catch構文でくくります。PHP5にもtry/catchはありますが、例えば先ほどのcopy関数は例外を発生させないので中途半端にしか使えません。C#の場合は、エラーが起きればすべて例外が出るはずです。

エラーが起きたときにはcatchでMessageBox.Showというダイアログ(アラートボックス)を表示させるメソッドを呼び出しています。「オフィス」ボタンを押してファイルが見つからなかったときはユーザに教えることができます。


@IT:連載 改訂版 C#入門 第18章 例外とエラー処理
もっと細かいところではこの辺りが参考になるかと。

ちなみにこんなエラーにも遭遇しました。
エラー 1 ローカルの変数 'e' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'e' の意味が変更されるのを避けるためです。 s:\Visual Studio 2008\Projects\HostsSwitcher\HostsSwitcher\Form1.cs 30 42 HostsSwitcher
つい癖でFileNotFoundException eと宣言していたらEventArgs eと先にeが使われていました。言語特有のエラーメッセージの意味は慣れないと気付くのに時間がかかります。PHPの場合は変数の上書き宣言がやり放題でこの類のエラーは出ないのでなおさらです。

続く


さて、いろいろ脱線するうちに長くなってきたのでひとまずここまで。

hosts を切り替えるWindowsアプリを作ってみる


先週はFlexをいじろうかと思っていましたが、別段作りたいものがあったわけでもないので先ほど思いついた表題のアプリを作ってみます。

今、ThinkPad X60をひざの上に乗せてタカタカ打っていてネットにはE-Mobileで接続しています。で、いつものように自分のWikiにアクセスしようとしたのですが繋がらない。なんでだろ、と思ったら192.168.x.xにアクセスしようとしていました。

C:\WINDOWS\system32\drivers\etc\hosts

というファイルに

192.168.0.10 zuzara.com

などと書いておくとブラウザなどでzuzara.comにアクセスするとDNSより優先して192.168.0.10に繋いでくれます。Linuxでは/ets/hostsです。DNSとかIPアドレス、名前解決といったキーワードでこの辺の詳しい話は検索できると思います。

諸事情によりこのファイルをいじっていたのですが、この設定が必要だったのはLANで繋ぐときだけで、E-Mobileのときは不要です。ローカルの192.168.x.xではなくグローバルIPでアクセスしてもらわないといけません。

というわけでワンタッチでhostsファイルを切り替えられるといいなぁ、と思いました。

ぱっと調べた限りそういうソフトはなさそう。コマンドプロンプトのDOSコマンドだけで充分できる作業ですが、最近VisualStudio2008を入れたまま使う機会がなかったのでexeを作ってみることにします。

Visual C# 2008 Express Editions をインストールする


VisualStudioは2003なら使い慣れていますが、2008は初。この2008はなんと無料。
Visual Studio 2008 Express Editions

サイトにアクセスしてC#の「Web インストール (ダウンロード)」をクリックすれば後は簡単にインストールできちゃいます。

いきなりC# でプログラミング?


VisualStudioはWindowsよりできがいいんじゃないか、と思っているクチなのでC#はほとんど知らない言語ですがIDEがカバーしてくれるのであまり気にせず行きます。

画面イメージをふくらませる


コンソールアプリ(アクセサリにあるコマンドプロンプトで動かす)でいいかな、と最初は思いましたがせっかくなのでウィンドウがあってボタンのあるアプリにします。あまりいかつくすると自分が使わなくなってしまいますが。。

早速作り始める


「新しいプロジェクト」で「Windowsフォーム アプリケーション」を選択。名前は安直ですがHostsSwitcherにしました。

……。


じゃーん。開始数分で出来上がったような気分にさせてくれるのはVisualStudioの威力です。左の「ツールボックス」にある「Button」を並べます。選択すると右下に「プロパティ」が出てくるのでTextを修正するだけ。

WindowsXPでThemeをクラシックにしているので見た目はこんなもんです。

VisualStudio2005まではCtrl+Shift+Bでビルド(コンパイル)だったのですが、この2008はF6を押すとビルドしてくれます。F5でデバッグ実行。押しても何も起きないボタンが2つあるアプリが実行されると思います。

ソリューションエクスプローラ、にプログラムのソースファイルなどが並んでいます。Program.csというのがソースのようです。

デバッグ方法を調べる


やはりまずはprintデバッグをできるようにしたい。というわけで「c# デバッグ」で検索。

[HOWTO Visual C# .NET でのトレースとデバッグの方法]

本家のMSのサイトが出てきました。

using System.Diagnostics;
...略
Debug.WriteLine("hoge");
Trace.WriteLine("hogehoge");
でOKのようです。usingはSystem.Diagnosticsの機能を使いますよ、という宣言。PHPだとファイルをrequireするようなものです。

ちょっとここは知らないとできませんが、先ほど配置したボタンをダブルクリックするとForm1.csというファイルが開かれてbutton1_Clickというメソッドが作成されると思います。ボタンをクリックした際の動作をここに記述できます。ここにWriteLineは書いてみました。

F5で実行すると、VisualStudio上にWriteLineした結果を出力できます。出力される場所はメニューの「表示」⇒「出力」で出てきます。

DebugとTraceの違いはなんだろうなぁ、とよく読んでみると
これに対して、Release ソリューション構成のプロジェクトでは、Trace クラスの出力のみ生成されます。Debug クラスのメソッドによる呼び出しはすべて無視されます。
だそうです。追々やることになるでしょう。

続く


次回で完成させちゃいたいところです。
Webアプリ全盛ですが、クライアントアプリ開発も楽しいものです。C#はVC++と比べてややこしいところが少なそうなのでホリデープログラミングには向いているのかも。

全1ページ

[1]


よしもとブログランキング

もっと見る

[PR]お得情報

いまならもらえる!ウィスパーうすさら
薄いしモレを防ぐ尿ケアパッド
話題の新製品を10,000名様にプレゼント
ふるさと納税サイト『さとふる』
11/30まで5周年記念キャンペーン中!
Amazonギフト券1000円分当たる!
いまならもらえる!ウィスパーWガード
薄いしモレを防ぐパンティライナー
話題の新製品を10,000名様にプレゼント

その他のキャンペーン


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事