ものえおさむ

C#で作る、あなただけのメモ帳 ~コマンドライン対応~

2009-10-20 15:43:00

はじめに
このブログでは、"Windows アプリケーションってどう作るのかよくわからない" といったプログラマ向けに Visual C# 2008 Express Edition (無償) を使用した Windows アプリケーションに作り方について説明しています。
Visual C# 2008 Express Edition (無償)(※) の入手方法については
この記事 を、プロジェクトのコンパイル方法については この記事を参照してください。

(※1)大学生、専門学校生の方は DreamSpark で、商用の Visual Studio を無償で入手することもできます。
(※2)設立 3 年未満のベンチャー企業の方は BizSparkで、Microsoft の開発製品、およびサーバー製品を無償で使用することができます。
(※3)従業員数 25 名以下の企業であれば WebsiteSpark で、Microsoft の開発製品、およびサーバー製品を無償で使用することができます。

"真の Windows アプリケーションを作成する"という目的でテキストエディタの作成方法を紹介してきましたが、大事な機能の実装を失念しておりました。

それはコマンドライン対応です。

昨今の若人の方々はご存知ないかも知れませんが、Windows の前身は "MS-DOS" という CUI ベースの OS でした。

この MS-DOS、 "えむえす、どす"という、なんとなく京都弁的な "はんなり" さを備えたその呼び名は、日本人であれば誰しもが一度は "えむえす、どすぅ~" と口にせずにはいられない奇妙な魔性を秘めており、やがては『MS‐DOSってなんどすか?』という名著のタイトルにまでフィーチャーされたものでした。

私がティンーンエイジャーと呼ばれる時分のパソコンの (その当時はもう "マイコン" とは呼ばなくなっていた) 多くには、MS-DOS がインストールされており、プログラムの起動はみな CRT に広がる漆黒の画面に実行ファイル名を叩き込んで行っておりました。

そのスピリッツを受け継いでかどうかは知りませんが、Windows アプリケーションはコマンドプロンプトからの起動ができるだけでなく、コマンドラインからさまざまな情報をアプリケーションに渡すことができるようになっています。

これはメモ帳でも例外ではなく、以下のようにコマンドラインからオープンするファイルを指定することができるのです。

 notepad テキストファイルまでのパス 

現在、Windows でアプリケーションというと、ウィンドウを備えたグラフィカルなものを連想しがちですが、ウィンドウを持たずにコマンドプロンプトで動作するアプリケーションも当然存在しますし、現役で活躍しております。

とうぜん、ビジュアル系開発ツールである Visual Studio でも、このコマンドラインで動作するアプリケーション、つまりはコマンドラインアプリケーションを作成することができます。

せっかくなので、ここで簡単に Visual Studio を使用したコマンドラインアプリケーションの作成方法について紹介しておきましょう。

Visual Studio でコマンドラインアプリケーションを作成するには以下の手順で作業を行います。

  1. Visual Studio を起動
  2. メニュー[ファイル] から [新規作成] - [プロジェクト] を選択
  3. [新しいプロジェクト] ダイアログボックスが表示されるので、画面左の[プロジェクトの種類] で "Visual C#" を選択し、画面右の [テンプレート] で "コンソールアプリケーション" を選択して [OK] ボタンをクリック

  4. 新規のプロジェクトが作成されるので、コードエディタ内の using System; 以外の不要な using 句を削除
  5. 画面右の [ソリューション エクスプローラ] 内の [参照設定] ツリーを展開し、System 以外の不要な参照設定をすべて削除
  6. コードエディタ内の Main 関数を以下のように記述

    static void Main(string[] args)
    {
       Console.WriteLine("入力された引数");

      //コマンドラインの引数が文字列の配列で渡されるので、ループして取り出し
       foreach (string inputArg in args)
       {
          Console.WriteLine(inputArg);
       }

     

  7. メニュー [ビルド] から [ソリューションのビルド] を選択
  8. 実行ファイル(*.exe) が以下のパスに生成されるので、実行ファイルをわかりやすいパスのフォルダにコピー

    プロジェクトを作成したフォルダまでのパス\bin\debug

  9. コマンドプロンプトを起動し、cd コマンドを使用して実行ファイルをコピーしたディレクトリに移動
  10. 以下のように実行ファイル名に続き、引数を入力し [Enter] キーを押下

    入力例)

     ConsoleApplication1.exe AAA BBB "CCC DDD"

以下のような結果が出力されます。

ちなみにインタラクティブ性を持たせたい場合は、以下のように Main 関数を記述します。

static void Main()
{
   Console.WriteLine("なにか入力して [Enter] キーを押下してくださいよ。");
   String inputArg = Console.ReadLine();
   Console.WriteLine("入力された文字は " + inputArg + "です。");
}

コマンドラインアプリケーションは、スケジューリングされた自動処理や、バックグラウンドでの処理といった、ユーザーからの逐次の入力を必要としないアプリケーションに最適ですので、Windows フォームアプリケーションとあわせ、用途に応じで適宜使い分けると良いでしょう。

 

サンプルアプリケーションのコマンドライン対応

Windows フォームアプリケーションのコマンドライン対応も、同じ要領で行います。

今までこのブログの内容をもとにアプリケーションを作成されていた方は、そのプロジェクトを Visual Studio でオープンしてください。

今回から、"ちょっとやってみようかな" と思った方は以下のリンクからサンプルプロジェクトをダウンロードしてください。

Sample7

Visual Studio Express Edition (無償) は以下のリンクから入手できますので、Visual Studio を持っていない方はダウンロードして入手してください。

Microsoft Visual Studio 2008 Express Edition

さて、サンプルアプリケーションのプロジェクトをオープンし、[ソリューションエクスプローラ] を確認すると Program.cs というファイルがあります。

オープンすると、アプリケーションのメイン エントリポイントの Main 関数があるので、以下のように書き換えます。

static void Main(string[] args)
 {
    Application.SetCompatibleTextRenderingDefault(false);
    Application.EnableVisualStyles();
    if (args.Length > 0)
    {
       //コマンドラインからの引数があった場合は、一番先頭の引数を Form1 のコンストラクタに渡す
       Application.Run(new Form1(args[0]));
    }
    else
    {
        Application.Run(new Form1());
    }
 }

次に Form1.cs をオープンして、Main 関数からの引数を受け取るためのコンストラクタを新規に、以下のように記述します。

//コマンドラインでファイルを指定された際に使用されるコンストラクタ
public Form1(string arg)
{
   InitializeComponent();
   editFilePath = arg;

   //ファイルが存在するか確認
   if (File.Exists(editFilePath))
   {
      //テキスト形式としてアプリケーションに登録されているかチェック
      if (CheckFileType(editFilePath))
      {
         //テキストファイルの内容をテキストボックスにロード
         textBox1.Text = File.ReadAllText(editFilePath, Encoding.Default);
      }

      //フォームのタイトル部分にファイル名を表示
      this.Text = GetFileNameString(arg, '\\');
      setDirty(false);
    }
    else
    {
       //ファイルが存在しない場合にエラーメッセージを表示
       MessageBox.Show(string.Format(Form1_Res.Msg_File_NotFound, editFilePath), 
            Form1_Res.MsgBoxTitle_FileOpen, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
}

以上でコマンドライン対応のコード記述は完了です。

ビルドが完了したら、コマンドラインで cd コマンドを使用して作業ディレクトリを実行ファイルのあるフォルダに切り替え、以下のように記述して目的のファイルがオープンされるか確認してください。

 EditerWrk.exe オープンするテキストファイルへのパス

コマンドラインでのテストが面倒な場合は、エクスプローラー上で、実行ファイルのアイコンに、テキストファイルをドラッグアンドドロップしても動作を確認することができます。

うまくいかない人はここからサンプルをダウンロードしてお試しください。

Sample08.zip 

さて、長い期間にわたってお送りしてきました C# を使用したメモ帳の作成なのですが、次回いよいよ最終回です。

最終回では、このブログで紹介したサンプルをカスタマイズして実際に私が使用しているものを紹介させていただきます。

では。

※マイクロソフト社員のコミュニティ参加について

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 3件のコメント
#1 anonymous   2010-01-31 11:24:21
はじめましてです。
C#の勉強をするために、参考にして来ました

最終回を楽しみしておりますので、投稿されるのを待っております。

可能であれば、Grep検索機能についての投稿があれば大変嬉しいです。
(勝手な要望ですので気に障りましたら無視してください。)

ではでは。
#2 Sakura Mizuki   2011-09-21 16:55:18
いつになったら最終回なのでしょうか?

既にVisual Studio2010が公開になって1年以上が経ち
次期開発環境のVisualStudio11のプレビュー版が公開
されているので、ぜひそちらの方の話もして頂けると
ありがたいと思います。

あと、現在のキャレットのある列と行数をステータスバーに
表示するというのは入れて欲しいです。(メモ帳に標準で
実装されている内容なので。)

ちなみに私の作っているのにはツールバーを実装しています。
メニューから選ぶのも良いですがツールバーから直感的に
選ぶというのも選択肢の一つです。
#3 もち   2012-04-03 01:07:27
http://blogs.msdn.com/b/osamum/
こちらに移動したのかと思い、C#で検索してもメモ帳の話が見つかりません
最終回前に打ち切りでしょうか?
  • 新着記事
  • 特集
  • ブログ