Rev 48 | Blame | Last modification | View Log | RSS feed
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace SWAT_Office_App
{
public struct DriveEntry
{
public DateTime time; // Time of insertion
public string drive; // Drive letter of the drive
public string label; // Label of the drive
public string size; // Size of the drive in bytes (I think)
public string owner; // Owner to be specified
public string dock; // Dock number as choosen
}
public partial class DriveLogger_Form : Form
{
private static List<DriveEntry> driveEntryList= new List<DriveEntry>();
private static string logLocation = "DriveLogger Log.txt";
public static bool instanceAlreadyRunning = false;
public DriveLogger_Form()
{
// Disable thread safe checking
CheckForIllegalCrossThreadCalls = false;
driveEntryList.Clear();
InitializeComponent();
this.listView_Drives.AfterLabelEdit += new LabelEditEventHandler(listView_Drives_AfterLabelEdit);
this.KeyPreview = true;
this.KeyDown += new KeyEventHandler(DriveLogger_Form_KeyDown);
this.FormClosed += new FormClosedEventHandler(DriveLogger_Form_FormClosed);
using (StreamWriter sw = File.AppendText(logLocation))
{
sw.WriteLine("-- New Session Started --");
sw.WriteLine("Initializing form details");
}
// Adds columns to the listview
this.listView_Drives.Columns.Add("Owner", 145, HorizontalAlignment.Left);
this.listView_Drives.Columns.Add("Dock", 60, HorizontalAlignment.Center);
this.listView_Drives.Columns.Add("Time", 130, HorizontalAlignment.Center);
this.listView_Drives.Columns.Add("Drive", 40, HorizontalAlignment.Center);
this.listView_Drives.Columns.Add("Label", 109, HorizontalAlignment.Center);
this.listView_Drives.Columns.Add("Size", 60, HorizontalAlignment.Center);
// Initializes and starts a backgroundworker thread for monitoring for new drives
BackgroundWorker bgWorker = new BackgroundWorker();
instanceAlreadyRunning = true;
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.RunWorkerAsync();
}
void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
// Compares a list of drives detected previously with the a list of current
// drives on the computer. If a change in length is detected, a drive is either
// added or removed so the drive in question is found and operated upon
List<string> drivesPreviouslyDetectedList = new List<string>();
DriveInfo[] newlyDetectedDrives = DriveInfo.GetDrives();
// Resets both lists to hold the same drives
drivesPreviouslyDetectedList.Clear();
foreach (DriveInfo drive in newlyDetectedDrives)
drivesPreviouslyDetectedList.Add(drive.Name);
while (true)
{
// Cancels thread if DriveLogger form is closed
if (!instanceAlreadyRunning)
{
//MessageBox.Show("Thread Stopped");
e.Cancel = true;
break;
}
// Pulls new list of current drives on computer
newlyDetectedDrives = DriveInfo.GetDrives();
if (newlyDetectedDrives.Length > drivesPreviouslyDetectedList.Count)
{
// Applies if a drive is attached to the computer
// Goes through each list and finds the drive that was recently attached
bool newDrivesDetected = false;
string driveOwner = "";
string driveDock = "";
foreach (DriveInfo drive in newlyDetectedDrives)
{
// Skips the drive if it is in the list of drives to ignore
if (Settings_Form.driveLoggerDrivesToIgnore.Contains(drive.Name))
continue;
// Check for non-matching entries
if (!drivesPreviouslyDetectedList.Contains(drive.Name))
{
// Creates and populates a new DriveEntry
DriveEntry newEntry = new DriveEntry();
if (newDrivesDetected == false)
{
// First entry detected is prompted for dock label and owner name
newDrivesDetected = true;
DriveLogger_LabelPrompt_Form newPrompt = new DriveLogger_LabelPrompt_Form();
newPrompt.ShowDialog();
newEntry.owner = newPrompt.driveOwner;
driveOwner = newPrompt.driveOwner;
newEntry.dock = newPrompt.driveDock;
driveDock = newPrompt.driveDock;
}
else
{
// Subsequent entries use the previously entered dock label and owner
newDrivesDetected = true;
newEntry.owner = driveOwner;
newEntry.dock = driveDock;
}
// Sets other drive details for the drive
newEntry.time = DateTime.Now;
newEntry.drive = drive.Name;
DriveInfo tempDrive = null;
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo driveSearch in allDrives)
{
if (driveSearch.IsReady)
{
if (driveSearch.Name == newEntry.drive)
{
tempDrive = driveSearch;
break;
}
}
}
newEntry.label = tempDrive.VolumeLabel;
// Determines the size of the attached drive
if ((tempDrive.TotalSize / 1073741824) > 0)
newEntry.size = (tempDrive.TotalSize / 1073741824).ToString() + " GB";
else
newEntry.size = (tempDrive.TotalSize / 1048576).ToString() + " MB";
// Adds the new DriveEntry into driveList
driveEntryList.Add(newEntry);
using (StreamWriter sw = File.AppendText(logLocation))
{
sw.WriteLine("Drive Attached -- [" + newEntry.time.ToString() + "]\t\"" + newEntry.owner + "\"\t" + newEntry.drive + "\t\"" + newEntry.label + "\"\t" + newEntry.size);
}
paintDriveListbox();
}
}
// Clears and refreshes the drivesPreviouslyDetected list
drivesPreviouslyDetectedList.Clear();
foreach (DriveInfo drive in newlyDetectedDrives)
{
drivesPreviouslyDetectedList.Add(drive.Name);
}
}
if (newlyDetectedDrives.Length < drivesPreviouslyDetectedList.Count)
{
// Applies if a drive is removed to the computer
// Goes through each list and finds the drive that was recently removed
bool removedDriveFound = false;
foreach (string str in drivesPreviouslyDetectedList)
{
// Skips the drive if it is in the list of drives to ignore
if (Settings_Form.driveLoggerDrivesToIgnore.Contains(str))
continue;
removedDriveFound = false;
// Loop here checks for non-matching entries in the two lists
foreach (DriveInfo drive in newlyDetectedDrives)
{
// If entries match, drive was not removed
if (str == drive.Name)
{
removedDriveFound = true;
break;
}
}
// If list mismatch is detected, remove from driveEntryList
if (removedDriveFound == false)
{
// Removes drive from driveList
foreach (DriveEntry entry in driveEntryList)
{
if (str == entry.drive)
{
driveEntryList.Remove(entry);
// Log the removal of the drive
using (StreamWriter sw = File.AppendText(logLocation))
{
sw.WriteLine("Drive Removed -- [" + entry.time.ToString() + "]\t" + entry.drive + "\t\"" + entry.label + "\"\t" + entry.size);
}
break;
}
}
paintDriveListbox();
}
}
// Clears and refreshes the drivesPreviouslyDetected list
drivesPreviouslyDetectedList.Clear();
foreach (DriveInfo drive in newlyDetectedDrives)
{
drivesPreviouslyDetectedList.Add(drive.Name);
}
}
// Sleeps the thread for a specified amount of time
Thread.Sleep(Settings_Form.driveLoggerRefreshInterval);
}
}
void DriveLogger_Form_KeyDown(object sender, KeyEventArgs e)
{
// Monitors for keypresses for the about box and refresh
switch (e.KeyCode)
{
case Keys.OemQuestion:
AboutBox window = new AboutBox();
window.ShowDialog();
break;
case Keys.F5:
refreshDrives();
break;
}
}
void listView_Drives_AfterLabelEdit(object sender, LabelEditEventArgs e)
{
// Logs the new label if it is changed
if (e.Label != null)
{
using (StreamWriter sw = File.AppendText(logLocation))
{
ListViewItem entry = listView_Drives.Items[e.Item];
sw.WriteLine("Label \"" + e.Label + "\" added to drive " + entry.SubItems[3].Text);
}
}
}
void DriveLogger_Form_FormClosed(object sender, FormClosedEventArgs e)
{
// Resets variable so form can be opened again
instanceAlreadyRunning = false;
}
private void paintDriveListbox()
{
// Updates the listview
this.listView_Drives.BeginUpdate();
this.listView_Drives.Items.Clear();
// Adds each entry from the driveList into the listView
foreach (DriveEntry entry in driveEntryList)
{
if (entry.owner != "System Reserved")
{
ListViewItem item = new ListViewItem();
item.Text = entry.owner;
ListViewItem.ListViewSubItem subDock = new ListViewItem.ListViewSubItem();
subDock.Text = entry.dock;
item.SubItems.Add(subDock);
ListViewItem.ListViewSubItem subTime = new ListViewItem.ListViewSubItem();
subTime.Text = entry.time.ToString();
item.SubItems.Add(subTime);
ListViewItem.ListViewSubItem subDrive = new ListViewItem.ListViewSubItem();
subDrive.Text = entry.drive;
item.SubItems.Add(subDrive);
ListViewItem.ListViewSubItem subLabel = new ListViewItem.ListViewSubItem();
subLabel.Text = entry.label;
item.SubItems.Add(subLabel);
ListViewItem.ListViewSubItem subSize = new ListViewItem.ListViewSubItem();
subSize.Text = entry.size;
item.SubItems.Add(subSize);
this.listView_Drives.Items.Add(item);
}
}
this.listView_Drives.EndUpdate();
}
private void refreshDrives()
{
// Checks list of drive entries to see if any drives have been removed
bool removedDriveFound;
List<DriveEntry> drivesToRemove = new List<DriveEntry>();
// Checks each entry in driveList to see if matching drive is found on list
// of current drives. Removes entry from driveList if drive is not found.
DriveInfo[] currentDrives = DriveInfo.GetDrives();
for (int i = 0; i < driveEntryList.Count; i++)
{
DriveEntry storedDrive = driveEntryList[i];
removedDriveFound = false;
// Loop here checks for non-matching entries in the two lists
foreach (DriveInfo currentDrive in currentDrives)
{
// If entries match, drive was not removed
if (storedDrive.drive == currentDrive.Name)
{
removedDriveFound = true;
break;
}
}
// If list mismatch is detected, remove from driveList
if (removedDriveFound == false)
{
drivesToRemove.Add(storedDrive);
}
}
// Removes drive from driveList
foreach (DriveEntry entry in drivesToRemove)
{
// Removes drive from driveList
foreach (DriveEntry entry2 in driveEntryList)
{
if (entry.drive == entry2.drive)
{
driveEntryList.Remove(entry);
break;
}
}
}
paintDriveListbox();
}
}
}