private bool DriveReady(DriveInfo d) { if (!d.IsReady) { if (!NotReadyList.Contains(d.Name)) { LogBox.Invoke(new Action(() => LogBox.Text += "Drive " + d.Name + " is not ready" + Environment.NewLine)); NotReadyList.Add(d.Name); AlreadyReadDrives.Remove(d.Name); RemovableDrivesList.Invoke( new Action(() => { ListViewItem lvi = RemovableDrivesList.FindItemWithText(d.Name); if (lvi != null) { lvi.Remove(); } }) ); NonRemovableDrivesList.Invoke( new Action(() => { ListViewItem lvi = NonRemovableDrivesList.FindItemWithText(d.Name); if (lvi != null) { lvi.Remove(); } }) ); } return(false); } else { if (NotReadyList.Contains(d.Name)) { NotReadyList.Remove(d.Name); } } return(true); }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { Debug.WriteLine("bg worker started"); while (true) { System.Threading.Thread.Sleep(500); // maybe make this a customizable setting var RemovableDrives = DriveInfo.GetDrives().Where(drive => drive.DriveType == DriveType.Removable); var NonRemovableDrives = DriveInfo.GetDrives().Where(drive => drive.DriveType != DriveType.Removable); List <string> DrivesByName = new List <string>(); foreach (var d in RemovableDrives) { if (!DriveReady(d)) { continue; } RemovableDrivesList.Invoke( new Action(() => { ListViewItem lvi = RemovableDrivesList.FindItemWithText(d.Name); if (lvi == null) { bool FindINF = false; if (d.RootDirectory.GetFiles("Autorun.inf").Count() > 0) { FindINF = true; } string[] RowData = { d.VolumeLabel, d.DriveType.ToString(), d.DriveFormat, FindINF.ToString() }; RemovableDrivesList.Items.Add(d.Name).SubItems.AddRange(RowData); } DrivesByName.Add(d.Name); // used to detect if drive was removed } )); if (!AlreadyReadDrives.ContainsKey(d.Name)) { ReadAutoInfo(d.RootDirectory); AlreadyReadDrives.Add(d.Name, d.VolumeLabel); } } // remove drives from list that have been removed physically RemovableDrivesList.Invoke( new Action(() => { List <ListViewItem> Tmplvi = new List <ListViewItem>(); foreach (ListViewItem lvi in RemovableDrivesList.Items) { Tmplvi.Add(lvi); } foreach (ListViewItem lvi in Tmplvi) { if (!DrivesByName.Contains(lvi.Text)) // if our listview item is no longer connected, remove it { AlreadyReadDrives.Remove(lvi.Text); RemovableDrivesList.FindItemWithText(lvi.Text).Remove(); } } }) ); foreach (var d in NonRemovableDrives) { if (!DriveReady(d)) { continue; } try { bool FindINF = false; if (d.RootDirectory.GetFiles("Autorun.inf").Count() > 0) { FindINF = true; } string[] RowData = { d.VolumeLabel, d.DriveType.ToString(), d.DriveFormat, FindINF.ToString() }; NonRemovableDrivesList.Invoke( new Action(() => { if (NonRemovableDrivesList.FindItemWithText(d.Name) == null) { NonRemovableDrivesList.Items.Add(d.Name).SubItems.AddRange(RowData); } }) ); } catch (Exception err) { //MessageBox.Show(err.ToString()); LogBox.Invoke(new Action(() => LogBox.Text += "Drive " + d.Name + err.ToString() + Environment.NewLine)); } if (Properties.Settings.Default != null) { if (Properties.Settings.Default.NonRemovableToo) { if (!AlreadyReadDrives.ContainsKey(d.Name)) { ReadAutoInfo(d.RootDirectory); AlreadyReadDrives.Add(d.Name, d.VolumeLabel); } } } } //FirstRun = false; } }