public MainControl() { InitializeComponent(); //初始化浏览器 this.initChartBrowser(); this.chartBrowser.Navigate(dirRoot + @"\Views\Browser\main.html"); //若过了试用期并且未注册,则不进行U盘监听 if (!deviceService.CheckEffective()) { return; } deviceDic = new Dictionary <string, bool>(); deviceNotifier = DeviceNotifier.OpenDeviceNotifier(); deviceNotifier.OnDeviceNotify += OnDeviceNotifyEvent; try { allUsbDrives = DriveInfo.GetDrives().Where(x => x.DriveType == DriveType.Removable).ToArray(); //开启任务异步操作,避免多个采集站统计加载时界面假死 Thread ts = new Thread(() => { var resourceIndex = 0; var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition"); foreach (ManagementObject dm in searcher.Get()) { var drive = getValueInQuotes(dm["Dependent"].ToString()) + @"\"; diskArray = getValueInQuotes(dm["Antecedent"].ToString()).Split(','); driveNumber = Convert.ToInt32(diskArray[0].Remove(0, 6).Trim()); var disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); foreach (ManagementObject disk in disks.Get()) { if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber.ToString()) & disk["InterfaceType"].ToString() == "USB") { DeviceControl device = new DeviceControl(); var serialNumber = parseSerialFromDeviceID(disk["PNPDeviceID"].ToString()).ToUpper(); DriveInfo d = allUsbDrives.FirstOrDefault(x => x.Name == drive); if (d == null) { continue; } var deviceName = d.Name; var deviceRoot = d.RootDirectory; var checkToken = device.CheckDeviceToken(deviceName, serialNumber); if (checkToken < 0) { continue; } if (resourceIndex == 0) { MessageUtil.ShowMessage("资源已就绪,开始采集...", EnumData.MessageType.Information, this); resourceIndex++; } device.SetProgressDelegate += HandleRefreshProgess; Action <DirectoryInfo, string> copyAction = device.CopyFilesTo; copyAction.BeginInvoke(deviceRoot, serialNumber, null, null); } } } }); ts.IsBackground = true; ts.Start(); } catch { MessageUtil.ShowMessage("资源识别失败,请重启程序!", EnumData.MessageType.Warning, this); } }
private void OnDeviceNotifyEvent(object sender, DeviceNotifyEventArgs e) { if (e.EventType == EventType.DeviceArrival) { //检查当前设备是否需要续传文件 if (e.Device == null) { return; } //已存在同步资源的采集站,跳过 var serialNumber = e.Device.SerialNumber.ToUpper(); if (deviceDic.ContainsKey(serialNumber) && deviceDic[serialNumber]) { return; } if (!deviceDic.ContainsKey(serialNumber)) { deviceDic.Add(serialNumber, true); } else { deviceDic[serialNumber] = true; } //开启任务异步操作,避免多个采集站统计加载时界面假死 Thread ts = new Thread(() => { MessageUtil.ShowMessage("正在识别资源,请等待...", EnumData.MessageType.Information, this); var collected = false; while (!collected) { //每个3秒检测U盘设备 Thread.Sleep(3000); DriveInfo[] allDrives = DriveInfo.GetDrives().Where(x => x.DriveType == DriveType.Removable).ToArray(); DeviceControl device = new DeviceControl(); foreach (DriveInfo d in allDrives) { var deviceName = d.Name; var deviceRoot = d.RootDirectory; var checkToken = device.CheckDeviceToken(deviceName, serialNumber); if (checkToken < 0) { continue; } device.SetProgressDelegate += HandleRefreshProgess; Action <DirectoryInfo, string> copyAction = device.CopyFilesTo; copyAction.BeginInvoke(deviceRoot, serialNumber, null, null); collected = true; break; } } }); ts.IsBackground = true; ts.Start(); } else if (e.EventType == EventType.DeviceRemoveComplete) { //移除USB设备,渲染界面资源加载状态 if (e.Device == null) { return; } //检测采集站同步资源状态 var serialNumber = e.Device.SerialNumber.ToUpper(); if (deviceDic.ContainsKey(serialNumber) && deviceDic[serialNumber]) { deviceDic[serialNumber] = false; } //开启任务异步操作,避免界面假死 var exit = new Thread(() => { Thread.Sleep(3000); HandleRemoveDevice(serialNumber); }); exit.IsBackground = true; exit.Start(); } }