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