Entry search

第9回 日記アプリケーションを作る ―その5 ファイル一覧機能の実装

今回からアプリケーションの機能の実装を始める。まずはじめは日記の一覧を表示させる機能だ。
では、前回までに作成した「MyDiary」プロジェクトを開いてから作業を進めよう。

仕様の確認とプログラムの内容

さて、ここで第3回に考えた日記アプリケーションの仕様を確認しておこう。

第3回 日記アプリケーションの仕組みを考える
http://www.willcom-fan.com/wzero3/entries/staff/000205/
  • ファイル名は日時にする(例:2006年12月31日.txt」)
  • ファイルは「\My Documents\MyDiary」の下に保存する

ということで、まずは「\My Documents\MyDiary」フォルダをチェックして、一覧画面のListBoxコントロールに一覧を追加していく処理を入れていく。

フォルダチェックのプログラム

ソリューションエクスプローラから「listForm.vb」を右クリックして「コードの表示」を選択してコード画面を表示しよう。

ここで、画面上からイベントコードを追加する。画面上の左のプルダウンリストから「(listformイベント)」を選択し、右側から「Load」を選択する。すると、コード上に listForm_load関数が自動的に追加されるはずだ。

01s.jpg

Loadとは一覧画面が読み込まれた時点の処理を意味している。画面が読み込まれたらファイル一覧を取得してリストボックスに追加するというわけだ。

では一覧を取得するコードを実装してみよう。

    Private Sub listForm_Load(ByVal sender As Object, …
        For Each file As String In _
            System.IO.Directory.GetFiles( _
            "\My Documents\MyDiary\", "*年*月*日.txt")
            Me.diaryList.Items.Add(file)
        Next 
    End Sub

まず、For Eachで始まっている文の _ は1つの文を2行で表記するためのものである。そのため、_ をはずして次の行とあわせて、以下のように1行で記述してもいい。

For Each file As String In System.IO.Directory.GetFiles … )

ここで重要なのはSystem.IO.Directory.GetFiles関数だ。この関数で “\MyDocument\MyDiary”フォルダにある”*年*月*日.txt”形式のファイル一覧を取得できる。今回の目的にうってつけの関数だ。

それを1つずつ取り出すのが For Each ~ Next の構文だ。ファイルを1つ取り出してfile変数に格納する。これをファイルの数だけ繰り返す。つまりこのFor EachからNextの間をファイルの数だけ繰り返すわけだ。

Me.diaryList.Items.Add(file)では、一覧表示画面のリストボックス(diaryList)の項目(Items)に取り出したファイル名(file)を追加(Add)しているわけだ。

このような感じでファイルを1つずつ取り出してそのファイル名をリストボックスに格納するわけである。では実行してチェックしてみよう。

実行してみる

F5キーを押して実行し、エミュレータでテストしてみよう。

が、しかし、いきなりエラーが表示されてしまうだろう。

02s.jpg

パス’ \MyDocument\MyDiary’の一部が見つかりませんでした。

そりゃそうである。まだ、このフォルダが存在しないのにもかかわらず、ファイルを参照しに行ったのでエラーになったというわけである。では、いちどShift-F5を押してデバッグを停止してコードを修正しよう。

フォルダチェック機能の追加

さてどうしたらよいか? フォルダをチェックする前に、もしフォルダがなければフォルダを作成するようにコードを修正しよう。こうすれば始めて起動する際には自動的にフォルダを作成するので安心だ。

    Private Sub listForm_Load(ByVal sender As Object, …
        If Not System.IO.Directory.Exists( _
            "\My Documents\MyDiary\") Then
            System.IO.Directory.CreateDirectory( _
            "\My Documents\MyDiary\")
        End If
        For Each file As String In _
            System.IO.Directory.GetFiles( _
            "\My Documents\MyDiary\", "*年*月*日.txt")
            Me.diaryList.Items.Add(file)
        Next
    End Sub

さて、実行してみよう。今度はきちんとアプリケーションが起動されたはずだ。

ところが特に何も追加されてはいない。それもそのはず。フォルダには何もないからだ。これではテストができない。ということでテストファイルを作って登録しよう。

テストファイルをエミュレータ上に作成する

まずはパソコン上でメモ帳を使ってテストファイルを作成しよう。メモ帳で以下の内容のファイルを作成し、デスクトップ上に「2006年01月01日.txt」「2006年01月02日.txt」の名前で保存しよう。

  • 日記アプリケーションタイトル
  • 日記アプリケーション本文。ここから先は日記アプリケーションの本文になります。
  • 日記アプリケーションの本文ここまで。

続けてこのファイルをエミュレータにコピーする。まず、エミュレータの「ファイル」メニューから「構成」を選択して、「全般」タブの「共有フォルダ」をデスクトップにあわせる。「...」ボタンをクリックしてデスクトップを指定すればOKだ。

03s.jpg

設定が完了したら、エミュレータ上の「ファイル エクスプローラ」を起動しよう。フォルダから「Strage Card」を選択する。

04s.jpg

実はこの「Storage Card」が先ほど選択したデスクトップとリンクしている。あとは、「2006年01月01日」「2006年01月02日」のファイルをコピーし、すでにできあがっている「マイデバイス」内の「\MyDocumen\MyDiary」に貼り付ければいい。

ではもう一度実行してみよう(実行中の場合は、Shift+F5で終了してから再度実行しよう)。

05s.jpg

今度は、確かにファイル一覧が表示されていることが確認できるだろう。

ファイル名の抽出

ファイル一覧は取得できたものの、ファイル名はフルパスになっていてあまりきれいではない。ということでリストボックスに格納する前に一度ファイル名だけを取り出す処理をしてみよう。

    Private Sub listForm_Load(ByVal sender As Object, …
        If Not System.IO.Directory.Exists( _
            "\My Documents\MyDiary\") Then
            System.IO.Directory.CreateDirectory( _
            "\My Documents\MyDiary\")
        End If
        For Each file As String In _
            System.IO.Directory.GetFiles( _
            "\My Documents\MyDiary\", "*年*月*日.txt")
            Dim datename As String
            datename = System.IO.Path.GetFileName(file)
            Me.diaryList.Items.Add(datename)
        Next
    End Sub

今回も便利な関数を使おう。System.IO.Path.GetFileName関数は、フルパスのファイル名(\My Documents\MyDiary\2006年01月01日.txt)からファイル名だけ(2006年01月01日.txt)を取り出すことができる関数である。取り出したファイル名をdatename変数に格納して、最後にリストボックス(diaryList)に格納している。

実行するとこのような感じになる。

06s.jpg

ほぼいい感じだが、「.txt」が邪魔だ。もう1行処理を入れて「.txt」を削ってみよう。

        For Each file As String In _
            System.IO.Directory.GetFiles( _
            "\My Documents\MyDiary\", "*年*月*日.txt")
            Dim datename As String
            datename = System.IO.Path.GetFileNameWithoutExtension(file)
            Me.diaryList.Items.Add(datename)
        Next

GetFileNameWithoutExtension関数は先ほどのGetFileName関数と同じようにファイル名のみを取り出す関数だが、さらに拡張子も取り外してくれる。

07s.jpg

プログラムをすっきりさせよう

さて、だいぶプログラムが見づらくなってきたので、以下のように書き直して、最後にプログラムをすっきりさせよう。

Imports System.IO
Public Class listForm
            :
    Private Sub listForm_Load(ByVal sender As Object, …
        Dim filepath As String = "\My Documents\MyDiary\"
        If Not Directory.Exists(filepath) Then
            Directory.CreateDirectory(filepath)
        End If
        For Each file As String In _
            Directory.GetFiles(filepath, "*年*月*日.txt")
            Dim datename As String
            datename = Path.GetFileNameWithoutExtension(file)
            Me.diaryList.Items.Add(datename)
        Next
    End Sub
End Class

※変更履歴(2006年12月8日)
以下のように修正しました。

●6行目
誤:If Not Directory.Exists(folderpath) Then
正:If Not Directory.Exists(filepath) Then

●7行目
誤:Directory.CreateDirectory(folderpath)
正:Directory.CreateDirectory(filepath)

●10行目
誤:Directory.GetFiles(folderpath, "*年*月*日.txt")
正:Directory.GetFiles(filepath, "*年*月*日.txt")

まず、ファイルに関する関数はみな、System.IO. で始まっているがこれを毎回書くのは面倒であり、またコードが見づらくなる。そこで一番先頭に Impots 構文を使って System.IO を記載しておくと、これ以降の System.IOの記述を省略することができる。

また、"\My Documents\MyDiary\"が何度も出てくるので、filepath変数に格納した。これですっきりした上にもし、パスの修正があった場合に変更する箇所が1箇所で済むようになる。

まとめ

今回は主にファイルの操作に関する処理を実装した。.NET Compact Framework にはファイルに関する便利な関数が多数用意されている。こういった関数を使うことで簡単に処理が実装できることが実感できたと思う。

また、最後に行ったプログラムをまとめる処理はリファクタリングと呼ばれるもので、こういったことをすることで後々プログラムが見やすくなり、また後からプログラムを修正しやすくなる。少しずつなれていこう。

では、次回は入力画面を作成していこう。

<執筆者プロフィール>

高橋 忍
元は、某重工業メーカにて航空機の自動操縦システムのソフトウェア 開発に従事。 その後、マイクロソフトにて開発サポート、コンサルタントを経て、 現在はエバンジェリストとして開発者に新しい技術を紹介している。難しい技術を楽しくわかりやすく伝えるのがモットー。
http://blogs.msdn.com/shintak/

高橋 忍のブログ
http://blogs.msdn.com/shintak/default.aspx
MSDN eye: 第 8 回「Windows Mobile 開発」
http://www.microsoft.com/japan/msdn/eye/

<書籍情報>

Windows Mobile 5.0のアプリケーション開発について、もっと詳しく知りたくなったら

Windows Mobile 5.0 アプリケーション開発 Beginner's Book

Windows Mobile 5.0 アプリケーション開発 Beginner's Book

高橋 忍・著/280ページ/2色印刷/B5変形/CD-ROM付
価格3129円(税込)/ISBN4-7741-2891-0/技術評論社・刊
発売日・2006年9月22日

This article posted by staff on 2006/10/12 11:25

Track back URL

http://www.willcom-fan.com/adm/mt-tb.cgi/151

Track backs: