|
只好自己写了: using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.IO; using System.Management; using System.Data; namespace Kimbanx.ExplorerControls { #region 定义事件参数 class DriveAddedEventArgs : EventArgs { private string _name; private string _label; public DriveAddedEventArgs(string name,string label) { this._name = name; this._label = label; } public string Name { get { return _name; } } public string Label { get { return _label; } } } class DriveChangedEventArgs : EventArgs { private string _name; private string _label; public DriveChangedEventArgs( string name, string label) { this._name = name; this._label = label; } public string Name { get { return _name; } } public string Label { get { return _label; } } } class DriveRemovedEventArgs:EventArgs { private string _name; public DriveRemovedEventArgs(string name) { this._name = name; } public string Name { get { return _name; } } } #endregion #region 定义委托 public delegate void DriveAdded(object sender,DriveAddedEventArgs e); public delegate void DriveChanged(object sender,DriveChangedEventArgs e); public delegate void DriveRemoved(object sender,DriveRemovedEventArgs e); #endregion class LogicalDriveWatcher { private static long interval = 10000; private static LogicalDriveWatcher _watcher=new LogicalDriveWatcher (); private Timer _timer; private DataTable _lastscan; private DataTable _thisscan; private List <string> _serialnumbers; public event DriveAdded DriveAdded; public event DriveChanged DriveChanged; public event DriveRemoved DriveRemoved; private LogicalDriveWatcher() { if (Environment.OSVersion.Platform == System.PlatformID.Win32Windows) return; _serialnumbers = new List <string>(); InitDataTable(); _timer = new Timer(new TimerCallback(StartWatch), null, 0, interval); } private void InitDataTable() { _lastscan = new DataTable(); _lastscan.Columns.Add("name"); _lastscan.Columns.Add("serialnumber"); _lastscan.Columns.Add("label"); _thisscan = new DataTable(); _thisscan.Columns.Add("name"); _thisscan.Columns.Add("serialnumber"); _thisscan.Columns.Add("label"); ManagementClass mcHD = new ManagementClass("win32_logicaldisk"); ManagementObjectCollection mocHD = mcHD.GetInstances(); foreach (ManagementObject m in mocHD) { DataRow dr = _lastscan.NewRow(); dr["name"] = m["DeviceId"].ToString(); dr["serialnumber"] = m["VolumeSerialNumber"].ToString(); dr["label"] = m["VolumeName"].ToString(); _lastscan.Rows.Add(dr); if (!_serialnumbers.Contains(dr["serialnumber"].ToString())) _serialnumbers.Add(dr["serialnumber"].ToString()); } } public static LogicalDriveWatcher GetLogicalDriveWatcher() { return _watcher; } private void StartWatch(object state) { ManagementClass mcHD = new ManagementClass("win32_logicaldisk"); ManagementObjectCollection mocHD = mcHD.GetInstances(); DataRow[] lastfoundrows; DataRow[] thisfoundrows; _thisscan.Rows.Clear(); foreach (ManagementObject m in mocHD) { DataRow dr = _thisscan.NewRow(); dr["name"] = m["DeviceId"].ToString(); dr["serialnumber"] = m["VolumeSerialNumber"].ToString(); dr["label"] = m["VolumeName"].ToString(); _thisscan.Rows.Add(dr); if (!_serialnumbers.Contains(dr["serialnumber"].ToString())) _serialnumbers.Add(dr["serialnumber"].ToString ()); } List <string> needtoremoved = new List <string>(); foreach (string sn in _serialnumbers) { lastfoundrows = _lastscan.Select("serialnumber=\'" + sn + "'","name ASC"); thisfoundrows = _thisscan.Select("serialnumber=\'" + sn + "'","name ASC"); foreach (DataRow ld in lastfoundrows) { bool found = false; foreach (DataRow td in thisfoundrows) { if (ld["name"].ToString () == td["name"].ToString ()) { if (ld["label"].ToString () != td["label"].ToString ()) { OnDriveChanged(new DriveChangedEventArgs(td["name"].ToString (), td["label"].ToString ())); } found = true; break; } } if (found == false) { OnDriveRemoved(new DriveRemovedEventArgs(ld["name"].ToString ())); } } foreach (DataRow td in thisfoundrows) { bool found = false; foreach (DataRow ld in lastfoundrows) { if (ld["name"].ToString () == td["name"].ToString ()) { found = true; break; } } if (found == false) { OnDriveAdded(new DriveAddedEventArgs(td["name"].ToString(),td["label"].ToString())); } } if (thisfoundrows.Length == 0) { needtoremoved.Add(sn); } } foreach (string ds in needtoremoved) { _serialnumbers.Remove(ds); } _lastscan.Rows.Clear(); _lastscan = _thisscan.Copy(); } private void OnDriveAdded(DriveAddedEventArgs e) { if (this.DriveAdded != null) DriveAdded(this, e); } private void OnDriveRemoved(DriveRemovedEventArgs e) { if (this.DriveRemoved != null) DriveRemoved(this, e); } private void OnDriveChanged(DriveChangedEventArgs e) { if (this.DriveChanged != null) DriveChanged(this, e); } } }
|