NonSoft

フォルダ内のファイル更新時に通知する
サンプル(VB.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
フォルダ内のファイルを監視しファイルが新規作成、更新、削除された時に通知をするサンプルを
作ってみました。System.IO.DirectoryInfoを使用しフォルダ内のファイル一覧を取得しています。
そのファイル一覧を使用してファイル追加チェックおよびファイル削除チェックをしています。
また、System.IO.File.GetLastWriteTimeを使用してファイルの更新日時を取得し、ファイル更新
チェックをしています。

ファイルが更新された事をすぐに知りたいと言う要望を聞く事があり、そんな時にこのサンプルが
役に立つかも知れません。今でも、「共有フォルダにファイルを置くから勝手に見ろ」と言う方が
多いようです。何故「ファイル更新したよ」と声を掛けるとかメールで添付するとか出来ないんで
しょうか?そして、見忘れると「なんで見て無いんだ」と。。。

関連するツールはこちらです。PC状況メール通知(PcEvMail)
 PC起動/PC終了/ログイン/ログアウト/ファイル更新時にメール通知/ログ出力するツールです。
・ファイル監視人 ファイル更新時にメールで通知する方法
 ファイルやフォルダの更新時にメッセージ表示またはメール送信するツールです。
・フォルダ監視人 ファイル更新時に指定プログラムを実行するツール
 フォルダ内のファイル更新時に更新通知(差分メール可)、指定プログラム実行するツールです。

★フォームモジュール(Form1.vb)
Public Class Form1

    ''' <summary>
    ''' フォルダ内のファイルPATH一覧
    ''' </summary>
    ''' <remarks></remarks>
    Private filePath As String() = New String(-1) {}

    ''' <summary>
    ''' フォルダ内のファイルの更新日時一覧
    ''' </summary>
    ''' <remarks></remarks>
    Private fileDate As String() = New String(-1) {}

    ''' <summary>
    ''' フォームロード
    ''' </summary>
    ''' <param name="sender">sender</param>
    ''' <param name="e">e</param>
    ''' <remarks></remarks>
    Private Sub Form1_Load( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' (初期設定)フォルダ内のファイルPATH一覧を取得
        filePath = GetFileList("c:\temp")

        ' (初期設定)フォルダ内のファイルの更新日時を取得
        ReDim fileDate(UBound(filePath))
        For i As Integer = 0 To UBound(filePath)
            fileDate(i) = IO.File.GetLastWriteTime(filePath(i)).ToString("yyyyMMddHHmmss")
        Next
    End Sub

    ''' <summary>
    ''' ファイル更新チェック&通知
    ''' </summary>
    ''' <param name="sender">sender</param>
    ''' <param name="e">e</param>
    ''' <remarks></remarks>
    Private Sub Timer1_Tick( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        ' ファイル更新チェックタイマー停止
        Timer1.Enabled = False

        For i As Integer = 0 To UBound(filePath)
            ' ファイル更新チェック
            If IO.File.Exists(filePath(i)) Then
                If fileDate(i) <> _
                    IO.File.GetLastWriteTime(filePath(i)).ToString("yyyyMMddHHmmss") Then
                    ' ファイル更新通知
                    MessageBox.Show("ファイル(" & filePath(i) & ")が更新されました。")
                End If
            Else
                ' ファイル削除通知
                MessageBox.Show("ファイル(" & filePath(i) & ")が削除されました。")
            End If
        Next

        ' フォルダ内のファイルPATH一覧を取得
        Dim fPath As String() = GetFileList("c:\temp")
        For i As Integer = 0 To UBound(fPath)
            ' ファイル追加チェック
            Dim addFlg As Boolean = True
            For j As Integer = 0 To UBound(filePath)
                If fPath(i) = filePath(j) Then
                    addFlg = False
                    Exit For
                End If
            Next
            ' ファイル追加通知
            If addFlg Then
                MessageBox.Show("ファイル(" & fPath(i) & ")が追加されました。")
            End If
        Next

        ' フォルダ内のファイルPATH一覧を保存
        filePath = fPath

        ' フォルダ内のファイルの更新日時を保存
        ReDim fileDate(UBound(filePath))
        For i As Integer = 0 To UBound(filePath)
            fileDate(i) = IO.File.GetLastWriteTime(filePath(i)).ToString("yyyyMMddHHmmss")
        Next

        ' ファイル更新チェックタイマー再開
        Timer1.Enabled = True
    End Sub

    ''' <summary>
    ''' フォルダ内のファイルPATH一覧(配列)取得
    ''' </summary>
    ''' <param name="ipath">フォルダPATH</param>
    ''' <returns>ファイルPATH一覧(配列)</returns>
    ''' <remarks></remarks>
    Public Function GetFileList(ByVal ipath As String) As String()
        Dim flist As String() = New String(-1) {}

        ' フォルダ情報取得
        Dim curFol As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(ipath)

        ' フォルダ内のファイルPATHの一覧作成
        Dim fil As System.IO.FileInfo() = curFol.GetFiles()
        For i As Integer = 0 To UBound(fil)
            ReDim Preserve flist(UBound(flist) + 1)
            flist(UBound(flist)) = fil(i).FullName
        Next

        ' ファイルPATH一覧(配列)を返す
        Return flist
    End Function
End Class