CSDN-CSDN社区-.NET技术-.NET Framework

收藏 请教关于文件系统的监测问题[问题点数:50,无满意答案结帖,结帖人:duke008]

  • duke008
  • 等 级:
  • 结帖率:
楼主发表于:2008-04-14 17:49:06
我知道用FileSystemWatcher可以监视某文件夹内的变化。
但是如何监视磁盘盘符的变化呢?
比如说我插入了一块移动硬盘或U盘,系统为其分配盘符,或者用户在磁盘管理器中为某分区分配盘符或修改盘符时。
回复次数:3
  • maco_wang用户头像
  • maco_wang
  • (哈尔滨☆叶子)
  • 等 级:
  • 2

#1楼 得分:0回复于:2008-04-16 07:54:30
问题好像比较有深度!
  • syeerzy用户头像
  • syeerzy
  • (快乐永远*先天下之乐而乐*后天)
  • 等 级:
#2楼 得分:0回复于:2008-04-16 08:43:27
添加可移动设备和修改盘符可是两件完全不同的事情.


添加可移动设备可以靠自己写个消息循环拦收硬件通知. 修改盘符这个没整过,你可以试试看修改盘符的时候有些什么样的Windows消息,然后再决定怎么做.
#3楼 得分:0回复于:2008-04-25 11:41:51
只好自己写了:
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);
        }

    }
}
相关问题
请教高手!文件系统问题, Linux/Unix社区/ 系统维护与使用区- CSDN ...
请教:关于内存泄漏问题的检测方案Java / 框架、开源- CSDN社区 ...
请教高手:有没有得到文件系统上的文件,是否有进程正在使用它的函数 ...
高分请教:请问FAT32和NTFS两种文件系统那一个更节省磁盘空间呢 ...
请教:装vs.net出现的问题---“检测到安装失败,请按确认键后退出 ...
基础问题请教!实现检测一个目录是否存在,如果不存在则新建一个目录 ...