表單載入時檢查服務是否安裝,並自動重新整理日誌列表:
private void frmViewLog_Load(object sender, EventArgs e) {
try {
ServiceController ctrl = new ServiceController("MyFileSystemWatcher");
var status = ctrl.Status; // 若無例外代表已安裝
ctrl.Dispose();
bolServiceInstalled = true;
} catch (Exception ex) {
lblServiceInstall.Text = "服務尚未安裝";
myTimer.Enabled = false;
btnStartService.Enabled = false;
btnStopService.Enabled = false;
bolServiceInstalled = false;
MessageBox.Show(this, "服務尚未安裝:" + ex.Message, "系統錯誤");
}
btnRefresh_Click(null, null);
}
查詢 FileSystemLog 資料表,依 EventStyle 設定圖示與分組:
private void btnRefresh_Click(object sender, EventArgs e) {
this.Cursor = Cursors.WaitCursor;
lvwRecord.BeginUpdate();
try {
lvwRecord.Items.Clear();
using (IDbCommand cmd = Util.DBConnection.CreateCommand()) {
cmd.CommandText = "SELECT RecordID, ObjectName, WatchTime, EventStyle FROM FileSystemLog ORDER BY WatchTime";
using (IDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
ListViewItem item = new ListViewItem();
item.Tag = reader.GetValue(0).ToString();
item.Text = reader.GetValue(1).ToString();
item.SubItems.Add(reader.GetValue(2).ToString());
string style = reader.GetValue(3).ToString().Trim().ToLower();
item.SubItems.Add(style);
switch (style) {
case "created": item.Group = lvwRecord.Groups[0]; item.ImageIndex = 0; break;
case "changed": item.Group = lvwRecord.Groups[1]; item.ImageIndex = 1; break;
case "deleted": item.Group = lvwRecord.Groups[2]; item.ImageIndex = 2; break;
case "renamed": item.Group = lvwRecord.Groups[3]; item.ImageIndex = 3; break;
}
item.StateImageIndex = item.ImageIndex;
lvwRecord.Items.Add(item);
}
}
}
myStatus.Text = $"共列出 {lvwRecord.Items.Count} 個記錄";
} catch (Exception ex) {
MessageBox.Show(ex.ToString(), "系統錯誤");
} finally {
this.Cursor = Cursors.Default;
lvwRecord.EndUpdate();
}
}
利用 ListViewItem.Tag 保存的 RecordID 組合 SQL 刪除:
private void btnDelete_Click(object sender, EventArgs e) {
if (lvwRecord.SelectedItems.Count > 0) {
using (IDbCommand cmd = Util.DBConnection.CreateCommand()) {
for (int i = lvwRecord.Items.Count - 1; i >= 0; i--) {
ListViewItem item = lvwRecord.Items[i];
if (item.Selected) {
cmd.CommandText = $"DELETE FROM FileSystemLog WHERE RecordID = '{item.Tag}'";
cmd.ExecuteNonQuery();
lvwRecord.Items.Remove(item);
}
}
}
}
}
透過 ServiceController 非同步發送控制指令:
private void btnStartService_Click(object sender, EventArgs e) {
if (!bolServiceInstalled) return;
using (ServiceController ctrl = new ServiceController("MyFileSystemWatcher")) {
if (ctrl.Status == ServiceControllerStatus.Stopped) ctrl.Start();
}
}
private void btnStopService_Click(object sender, EventArgs e) {
if (!bolServiceInstalled) return;
using (ServiceController ctrl = new ServiceController("MyFileSystemWatcher")) {
if (ctrl.Status == ServiceControllerStatus.Running) ctrl.Stop();
}
}
每 2 秒檢查服務狀態,啟用/停用對應按鈕:
private void myTimer_Tick(object sender, EventArgs e) {
if (!bolServiceInstalled) return;
using (ServiceController ctrl = new ServiceController("MyFileSystemWatcher")) {
btnStartService.Enabled = (ctrl.Status == ServiceControllerStatus.Stopped);
btnStopService.Enabled = (ctrl.Status == ServiceControllerStatus.Running);
}
}