Imports System.IO
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Security.Principal
Public Class FolderMonitorForm
Inherits Form
Private lblFolder As Label
Private txtFolderPath As TextBox
Private btnBrowse As Button
Private btnStart As Button
Private btnStop As Button
Private lstLog As ListView
Private watcher As FileSystemWatcher
Private btnClose As Button
Private logFilePath As String
Public Sub New()
' ログファイルにタイムスタンプを付加して一意のファイル名にする
logFilePath = "monitor_log_" & DateTime.Now.ToString("yyyyMMdd_HHmmss") & ".txt"
' フォームの設定
Me.Text = "フォルダ監視ソフト"
Me.Size = New System.Drawing.Size(600, 400)
' ラベル: フォルダパス
lblFolder = New Label()
lblFolder.Text = "監視するフォルダ:"
lblFolder.SetBounds(10, 10, 100, 20)
Me.Controls.Add(lblFolder)
' テキストボックス: フォルダパス
txtFolderPath = New TextBox()
txtFolderPath.SetBounds(120, 10, 250, 20)
txtFolderPath.Text = GetLastMonitoredFolder()
Me.Controls.Add(txtFolderPath)
' ボタン: フォルダ選択
btnBrowse = New Button()
btnBrowse.Text = "参照"
btnBrowse.SetBounds(380, 10, 75, 25)
AddHandler btnBrowse.Click, AddressOf btnBrowse_Click
Me.Controls.Add(btnBrowse)
' ボタン: 監視開始
btnStart = New Button()
btnStart.Text = "監視開始"
btnStart.SetBounds(120, 40, 75, 25)
AddHandler btnStart.Click, AddressOf btnStart_Click
Me.Controls.Add(btnStart)
' ボタン: 監視停止
btnStop = New Button()
btnStop.Text = "監視停止"
btnStop.SetBounds(200, 40, 75, 25)
btnStop.Enabled = False
AddHandler btnStop.Click, AddressOf btnStop_Click
Me.Controls.Add(btnStop)
' ListView: 監視ログ
lstLog = New ListView()
lstLog.View = View.Details
lstLog.Columns.Add("ファイル名", 150, HorizontalAlignment.Left)
lstLog.Columns.Add("更新者", 100, HorizontalAlignment.Left)
lstLog.Columns.Add("変更タイプ", 100, HorizontalAlignment.Left)
lstLog.Columns.Add("変更時間", 150, HorizontalAlignment.Left)
lstLog.SetBounds(10, 80, 560, 250)
lstLog.FullRowSelect = True
Me.Controls.Add(lstLog)
' ボタン: 閉じる
btnClose = New Button()
btnClose.Text = "閉じる"
btnClose.SetBounds(380, 340, 75, 25)
AddHandler btnClose.Click, AddressOf btnClose_Click
Me.Controls.Add(btnClose)
' フォームがリサイズされたときにリストビューのサイズを変更
AddHandler Me.Resize, AddressOf Form_Resized
' ファイルシステムウォッチャーの初期化
watcher = New FileSystemWatcher()
watcher.Filter = "*.*"
AddHandler watcher.Changed, AddressOf OnChanged
AddHandler watcher.Created, AddressOf OnChanged
AddHandler watcher.Deleted, AddressOf OnChanged
AddHandler watcher.Renamed, AddressOf OnRenamed
End Sub
' フォルダ参照ボタン
Private Sub btnBrowse_Click(sender As Object, e As EventArgs)
Using fbd As New FolderBrowserDialog()
If fbd.ShowDialog() = DialogResult.OK Then
txtFolderPath.Text = fbd.SelectedPath
SaveLastMonitoredFolder(fbd.SelectedPath)
End If
End Using
End Sub
' 監視開始ボタン
Private Sub btnStart_Click(sender As Object, e As EventArgs)
If txtFolderPath.Text = "" Then
MessageBox.Show("フォルダを選択してください。")
Return
End If
watcher.Path = txtFolderPath.Text
watcher.EnableRaisingEvents = True
' フォルダ名をフォームのタイトルに表示
Me.Text = "監視中: " & txtFolderPath.Text
AddLogEntry("監視を開始しました", "システム", "開始", DateTime.Now, Color.Black)
btnStart.Enabled = False
btnStop.Enabled = True
End Sub
' 監視停止ボタン
Private Sub btnStop_Click(sender As Object, e As EventArgs)
watcher.EnableRaisingEvents = False
' タイトルを元に戻す
Me.Text = "フォルダ監視ソフト"
AddLogEntry("監視を停止しました", "システム", "停止", DateTime.Now, Color.Black)
btnStart.Enabled = True
btnStop.Enabled = False
End Sub
' 変更があったときの処理
Private Sub OnChanged(sender As Object, e As FileSystemEventArgs)
Dim fileName As String = Path.GetFileName(e.FullPath)
Dim owner As String = GetFileOwner(e.FullPath)
Dim changeTime As DateTime = DateTime.Now
AddLogEntry(fileName, owner, e.ChangeType.ToString(), changeTime, GetChangeTypeColor(e.ChangeType.ToString(), owner))
End Sub
' リネームされたときの処理
Private Sub OnRenamed(sender As Object, e As RenamedEventArgs)
Dim oldFileName As String = Path.GetFileName(e.OldFullPath)
Dim newFileName As String = Path.GetFileName(e.FullPath)
Dim owner As String = GetFileOwner(e.FullPath)
Dim changeTime As DateTime = DateTime.Now
AddLogEntry(newFileName, owner, "Renamed", changeTime, Color.Blue)
End Sub
' ファイルの所有者(更新者)を取得
Private Function GetFileOwner(filePath As String) As String
Try
Dim fileInfo As FileInfo = New FileInfo(filePath)
Dim fileSecurity = fileInfo.GetAccessControl()
Dim owner As NTAccount = CType(fileSecurity.GetOwner(GetType(NTAccount)), NTAccount)
Return owner.ToString()
Catch ex As Exception
Return "不明"
End Try
End Function
' ログエントリを追加
Private Sub AddLogEntry(fileName As String, owner As String, changeType As String, changeTime As DateTime, textColor As Color)
Dim item As New ListViewItem(fileName)
item.SubItems.Add(owner)
item.SubItems.Add(changeType)
item.SubItems.Add(changeTime.ToString("yyyy/MM/dd HH:mm:ss"))
item.ForeColor = textColor
lstLog.Items.Add(item)
SaveLog(String.Format("{0}, {1}, {2}, {3}", fileName, owner, changeType, changeTime.ToString("yyyy/MM/dd HH:mm:ss")))
' 自動スクロール
If lstLog.Items.Count > 0 Then
lstLog.EnsureVisible(lstLog.Items.Count - 1)
End If
End Sub
' ログをファイルに保存する
Private Sub SaveLog(logEntry As String)
Using sw As New StreamWriter(logFilePath, True)
sw.WriteLine(logEntry)
End Using
End Sub
' 閉じるボタン
Private Sub btnClose_Click(sender As Object, e As EventArgs)
watcher.EnableRaisingEvents = False
Me.Close()
End Sub
' 最後に監視したフォルダを保存する
Private Sub SaveLastMonitoredFolder(folderPath As String)
Using sw As New StreamWriter("last_monitored_folder.txt")
sw.WriteLine(folderPath)
End Using
End Sub
' 最後に監視したフォルダを取得する
Private Function GetLastMonitoredFolder() As String
If File.Exists("last_monitored_folder.txt") Then
Return File.ReadAllText("last_monitored_folder.txt")
End If
Return ""
End Function
' フォームがリサイズされたときにリストビューのサイズを変更
Private Sub Form_Resized(sender As Object, e As EventArgs)
lstLog.Width = Me.ClientSize.Width - 20
lstLog.Height = Me.ClientSize.Height - 150
End Sub
' 変更タイプに応じて文字色を返す
Private Function GetChangeTypeColor(changeType As String, owner As String) As Color
' 更新者に応じて色を変更する場合、特定のユーザーに対して異なる色を返す
If owner.Contains("Administrator") Then
Return Color.Purple
End If
Select Case changeType
Case "Changed"
Return Color.Orange
Case "Created"
Return Color.Green
Case "Deleted"
Return Color.Red
Case Else
Return Color.Black
End Select
End Function
End Class
Module FolderMonitorApp
Sub Main()
Application.EnableVisualStyles()
Application.Run(New FolderMonitorForm())
End Sub
End Module