CodeZine(コードジン)

特集ページ一覧

フォルダの変更をアラート表示する.NETアプリケーションの作成

NetAdvantage for Windows FormsのWinDesktopAlertコントロールを使った、アラート表示アプリケーションの作成

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/06/13 14:30

サーバや共有フォルダなどで、知らないうちにファイルが増えていたり削除されていることがよくあります。いつもフォルダの変更を監視しているわけではないので、フォルダを開いたときにしか分かりません。そこで、特定のフォルダの変更を監視し、フォルダ内のファイルの増減があると、自動的に通知してくれるアプリケーションを作成してみました。

フォルダのファイルが増えると...
フォルダのファイルが増えると...
アラートが表示される。フォルダ名をクリックするとそのフォルダが開く
アラートが表示される。フォルダ名をクリックするとそのフォルダが開く

はじめに

 例えばチーム内でのファイルの受渡しを、特定のファイルサーバや共有フォルダで行うようにしている場合、ファイル数の増減を把握したくなります。いつもフォルダの変更を監視しているわけではないので、実際にフォルダを開いてみないとファイルの増減は分かりません。そこで、特定のフォルダの変更を監視し、フォルダ内のファイルの増減があると、自動的に通知してくれるアプリケーションを作成してみました。

 情報の通知は、今行っている作業の邪魔にならないように、Windowsのタスクバーエリアに表示させます。これには、NetAdvantage for Windows FormsWinDesktopAlertコントロールを使用します。アラートにはリンクを設定し、アラート表示文字をクリックするとそのフォルダを開くようにします。

対象読者

 Visual Basic .NETやC#を使ってプログラムを作ったことのある人。

必要な環境

 Visual Basic 2005またはVisual C#2005、Visual Studio 2005でプログラムが作れる環境。

 なお、本プログラムはWindows Vista上で動作するVisual Studioを使用して作成し、Windows Vistaにて動作確認を行っています。Windows XP、Windows 2000では、フォルダの表示などで記事と多少違った動作をする可能性があります。

プログラム実行時の注意事項

 アプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。

  • Infragistics2.Win.Misc.v7.2.dll
    WinDesktopAlertコンポーネントを含む .NET アセンブリ。
  • Infragistics2.Shared.v7.2.dll
    .NET 用の Infragistics Shared サポート アセンブリ
  • Infragistics2.Win.v7.2.dll
    .NET 用の Infragistics Windows Forms サポート アセンブリ

 これらのファイルを、プログラムを実行するBinフォルダに格納します。

 .NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。

コンポーネントのインストール

 初めてNetAdvantage for Windows Formsを使用する方は、プロジェクトにNetAdvantage for Windows Formsをインストールする必要があります。

 インストーラは、インフラジスティックス社のWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページ左側の[ダウンロード]をクリックし、[NetAdvantage for .NET 2007.2 Full [CLR 2.0]]をクリックします(お試し版のインストールには、アカウント登録が必要です)。

 ファイルはZIP形式で圧縮されています。有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、お試し版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。

コントロールの追加

 NetAdvantage for Windows Formsは、自動でVisual Studio 2005のツールボックスにタブを作成しコントロールを登録します。

 スタートメニューから、[Infragistics]-[NetAdvantage for .NET 2007.2 FullCLR 2.0]-[NetAdvantage for .NETツール]-[Visual Studio ツールボックス タブの作成]を選び、タブユーティリティを実行します。このユーティリティを実行すると、Visual Studio .NETにWindowsフォームツール用の新しいツールボックス タブと、別に ASP.NET ツール用のタブが作成されます。次に、Visual Studio .NET のそれぞれのタブに NetAdvantage for .NET ツールキットにある使用可能なすべてのツールが追加されます。

タブユーティリティを実行すると...
タブユーティリティを実行すると...
自動的にWindowsフォームツール用の新しいタブが作成される
 自動的にWindowsフォームツール用の新しいタブが作成される

WinDesktopAlertについて

 WinDesktopAlertコンポーネントは、デスクトップに小さなアラートウィンドウを表示するコンポーネントです。

 メッセージボックスのように画面の中央などにポップアップするのではなく、タスクバーの通知領域に表示されます(表示位置はデフォルトではデスクトップの右下ですが、プロパティによって表示位置を指定できます)。アラートは、徐々に表示されるアニメーション効果を持っており、タイトルと メッセージ、アラートボタンを表示できます。

 このコンポーネントは、2つのスタイルを選ぶことができます。1つはOutlook 2007(デフォルト)スタイルで、もう1つはWindowsLiveMessengerスタイルです。また、アニメーションの速度や動作スタイルなどを設定でき、いずれもフォームデザイン時はタスクトレイで設定を行います。

アラートウィンドウの各部の名称
 アラートウィンドウの各部の名称

 メッセージテキストは、デフォルトでハイパーリンクが設定されるようになっており、クリックするとWinDesktopAlertコンポーネントにDesktopAlertLinkClickedイベントが発生し、このイベントハンドラで処理を実行させることができます。

 アラートボタンも、クリックするとAlertButtonClickedイベントが発生し、このイベントハンドラで処理を実行させることができます。アラートを表示させるには、Showメソッドを実行するだけです。

GUIの設定

 GUIはとても簡単で、フォームにUltraDesktopAlertTimerコントロールを配置し、フォームのWindowsStateを「Minimized」に設定するだけです。

 ただし、このままでは動作チェックなどがしにくくなりますので、機能を実装するまではフォームにボタンとラベルを配置し、動作を確認しながら開発するようにします。

 なお、UltraDesktopAlertコントロールはユーザーとの対話機能は持たす、プロセスだけを提供するコントロールなので、フォームの外に配置されます。

GUIの作成
GUIの作成

 UltraDesktopAlertコントロールにアラートボタンを組み込むには、プロパティウィンドウでAlertButtonsプロパティをクリックし、コレクションエディタでボタンを追加します。

 ボタンにイメージを組み込むには、エディタのImageプロパティをクリックし、イメージファイルを設定します。

コレクションエディタでボタンを追加
コレクションエディタでボタンを追加

コードの作成

 今回作成したプログラムは、Cドライブのルートにあるフォルダ「data」の変更の有無を、Timerコントロールと組み合わせて一定時間間隔でチェックし、変更があればデスクトップアラートで表示するものです。

 フォルダには、作成日時以外に最終更新日時が設定されています。この日時は、フォルダ内のファイルが削除されたり追加されたりすると更新されます。そこで、この最終更新日時をチェックし、更新されていればデスクトップアラートを表示するようにします。

 最終更新日時を取得するには、System.IO名前空間にあるFileInfoクラスのLastWriteTimeプロパティを参照します。

 デスクトップアラートでは、フォルダ内のファイルに変更があったというメッセージを表示し、この文字列をクリックすると「data」フォルダが開くようにします。

 フォルダを開く処理は、System.Diagnostics名前空間にあるProcessクラスのStartメソッドを使用します。

プログラムのスタートアップ処理

 フォルダが更新されているかどうかのチェックは、まずプログラム起動時にフォルダの最終更新日時を取得しておき、一定時間後にもう一度フォルダの最終更新日時を取得して、この値を比較します。最終更新日時が変わっていなければフォルダは更新されていませんので何もしません。最終更新日時が変わっていれば、フォルダは更新されていますので、デスクトップアラートを表示します。

 そこで、まずフォームのLoadイベントハンドラで、FileInfoクラスのLastWriteTimeプロパティからフォルダの最終更新日時を取得し変数basetimeに格納しておきます。

VB.NETの場合
Imports System.IO
Public Class Form1

    Dim fname As String = "c:\data"
    Dim basetime As DateTime, nowtime As DateTime

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        Dim fi As FileInfo = New FileInfo(fname)
        basetime = fi.LastWriteTime
    End Sub
C#の場合
using System.IO;
namespace WinDesktopAlert_cs
{
    public partial class Form1 : Form
    {
        String fname = "c:/data";
        DateTime basetime , nowtime;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            FileInfo fi  = new FileInfo(fname);
            basetime = fi.LastWriteTime;
        }

フォルダ内のファイルが変更された時の処理

 次に、再度フォルダの最終更新日時を取得し、変数basetimeの値と比較します。プログラム完成品は、この処理をTimerコントロールのTickイベントハンドラに記述しますが、動作確認のためにボタンのクリックイベントハンドラにも記述しておきます。

 もし、この2つの最終更新日時に差があれば、フォルダの最終更新日時が変更されたことになるので、デスクトップアラートを表示するために、UltraDesktopAlertコントロールのShowメソッドを実行します。Showメソッドはオーバーロードで3つのメソッドがありますが、今回は2つの引数を持つメソッドを使用しました。最初の引数がタイトル文字列で、2番目の引数はメッセージ文字列を指定します。

 アラートを表示したら、変数basetimenowtimeを同じ値にして、アラートの表示が出ないようにし、次の変更に備えます。また、ラベルには動作確認のため、2つの最終更新日時を表示しておきます。

VB.NETの場合
Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    Dim fi As FileInfo = New FileInfo(fname)

    nowtime = fi.LastWriteTime

    If nowtime > basetime Then
        Me.UltraDesktopAlert1.Show( _
            "アラートの表示", "フォルダ " & fname & _
            "内のファイル数に変更が生じました : " & _
            nowtime.ToString)
    End If
    basetime = nowtime
    
    Label1.Text = basetime
    Label2.Text = nowtime
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim fi As IO.FileInfo = New IO.FileInfo(fname)

    nowtime = fi.LastWriteTime

    If nowtime > basetime Then
        Me.UltraDesktopAlert1.Show( _
            "アラートの表示", "フォルダ " & fname & _
            "内のファイル数に変更が生じました : " & _
            nowtime.ToString)
    End If
    basetime = nowtime
End Sub
C#の場合
private void button1_Click(object sender, EventArgs e)
{
    FileInfo fi = new FileInfo(fname);

    nowtime = fi.LastWriteTime;

    if(nowtime > basetime){
        ultraDesktopAlert1.Show(
            "アラートの表示", "フォルダ " + fname +
            "内のファイル数に変更が生じました : " +
            nowtime);
    }
    basetime = nowtime;

    label1.Text = "" + basetime;
    label2.Text = "" + nowtime;
}

private void timer1_Tick(object sender, EventArgs e)
{
    FileInfo fi = new FileInfo(fname);

    nowtime = fi.LastWriteTime;

    if (nowtime > basetime)
    {
        ultraDesktopAlert1.Show(
            "アラートの表示", "フォルダ " + fname +
            "内のファイル数に変更が生じました : " +
            nowtime);
    }
    basetime = nowtime;
}

リンク文字列とアラートボタンがクリックされた時の処理

 デスクトップアラートが表示されると、 メッセージの文字列にリンクが自動的に設定されます。デフォルトでは、クリックするとアラートを呼び出したアプリケーションにフォーカスが移動するだけですが、処理を実行させることもできます。

 リンク文字列をクリックすると、UltraDesktopAlertコントロールにはDesktopAlertLinkClickedというイベントが発生しますので、このイベントハンドラに処理を作成します。

 このイベントハンドラをコードに組み込むには、プロパティウィンドウの[イベント]ボタンをクリックしてイベントリストを表示し、[DesktopAlertLinkClicked]をダブルクリックします。

プロパティウィンドウの[DesktopAlertLinkClicked]をダブルクリック
プロパティウィンドウの[DesktopAlertLinkClicked]をダブルクリック

 また、アラートボタンがクリックされると、UltraDesktopAlertコントロールにはAlertButtonClickedというイベントが発生しますので、このイベントハンドラに処理を作成します。イベントハンドラの作成方法は、DesktopAlertLinkClickedイベントと同じです。

 ここでは、監視しているフォルダを開く処理を組み込みます。これは、System.Diagnostics名前空間にある、ProcessクラスのStartメソッドを使用します。このメソッドを使うと、他のアプリケーションを起動することができます。Windows Vistaでは、フォルダの表示もインターネットエクスプローラを使っているので、これを起動します。最初の引数にアプリケーション名を、2番目の引数に表示させたいフォルダ名をフルパスで記述します。

VB.NETの場合
Private Sub UltraDesktopAlert1_DesktopAlertLinkClicked( _
    ByVal sender As System.Object, _
    ByVal e As Infragistics.Win.Misc.DesktopAlertLinkClickedEventArgs) _
    Handles UltraDesktopAlert1.DesktopAlertLinkClicked
    System.Diagnostics.Process.Start("IExplore.exe", fname)
    basetime = nowtime
End Sub

Private Sub UltraDesktopAlert1_AlertButtonClicked( _
    ByVal sender As System.Object, _
    ByVal e As Infragistics.Win.Misc.AlertButtonClickedEventArgs) _
    Handles UltraDesktopAlert1.AlertButtonClicked
    System.Diagnostics.Process.Start("IExplore.exe", fname)
    basetime = nowtime
End Sub
C#の場合
private void ultraDesktopAlert1_DesktopAlertLinkClicked(
    object sender, Infragistics.Win.Misc.DesktopAlertLinkClickedEventArgs e)
{
    System.Diagnostics.Process.Start("IExplore.exe", fname);
    basetime = nowtime;
}

private void ultraDesktopAlert1_AlertButtonClicked(object sender,
    Infragistics.Win.Misc.AlertButtonClickedEventArgs e)
{
    System.Diagnostics.Process.Start("IExplore.exe", fname);
    basetime = nowtime;
}

まとめ

 デスクトップアラートは、 メッセージボックスと違いデスクトップ下部に表示されるので、作業中でも邪魔することなくメッセージを表示させることができます。リンクやアラートボタンを使うことで、デスクトップアラートから次の処理を実行させることもできます。

 使い方もとても簡単ですから、ユーザーに情報を通知するアイテムとしていろいろな使い方ができるのではないでしょうか。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5