求助:USB盘文件夹监测,异常
本人写了个文件夹实时监测,原意用在读取一照相机U盘的更新的文件。测试时,拷贝到指定文件夹下是,异常,程序消失。namespace USBMonitor
{
public partial class Form1 : Form
{
public const int WM_DEVICECHANGE = 0x219;
public const int DBT_DEVICEARRIVAL = 0x8000;
public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
FileSystemWatcher watcher = new FileSystemWatcher();
public Form1()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
try
{
//当设备被插入/拔出的时候,WINDOWS会向每个窗体发送WM_DEVICECHANGE 消息,
//当消息的wParam 值等于 DBT_DEVICEARRIVAL 时,表示Media设备被插入并且已经可用;
//如果wParam值等于DBT_DEVICEREMOVECOMPLETE,表示Media设备已经被移出。
if (m.Msg == WM_DEVICECHANGE)
{
switch (m.WParam.ToInt32())
{
case WM_DEVICECHANGE:
break;
case DBT_DEVICEARRIVAL://U盘插入
//提供对有关指定驱动器的信息的访问。检索计算机上的所有逻辑驱动器的驱动器名称。
DriveInfo[] s = DriveInfo.GetDrives();
//循环访问
foreach (DriveInfo drive in s)
{
//Removable表示此驱动器是一个可移动存储设备,如软盘驱动器或 USB 闪存驱动器。
if (drive.DriveType == DriveType.Removable)
{
//drive.RootDirectory 获取驱动器的根目录。
listBox1.Items.Add("U盘已插入,盘符为:" + drive.Name.ToString());
//DICM根据实际情况,也可在图形界面手动添加
textBox1.Text = drive.Name.ToString() + "DICM";
monitor();
break;
}
}
break;
case DBT_DEVICEREMOVECOMPLETE: //U盘卸载
break;
default:
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
base.WndProc(ref m);
}
public void monitor()
{
watcher.Path = textBox1.Text;
listBox1.Items.Add("路径:" + textBox1.Text);
/* 设置为监视 LastWrite 和 LastAccess 时间方面的更改,以及目录中文本文件的创建、删除或重命名。 */
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// 只监控.txt文件
watcher.Filter = "*.jpg";
// 添加事件处理器。
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
//watcher.Renamed += new RenamedEventHandler(OnRenamed);
watcher.EnableRaisingEvents = true;
}
// 定义事件处理器。
private void OnChanged(object source, FileSystemEventArgs e)
{
//如果更改、创建或删除文件,文件路径将被输出到控制台。
string path1 = e.FullPath;
string path2 = textBox2.Text + e.Name;
//string path2 = "e:\\" + e.Name;
File.Copy(path1, path2);
listBox1.Items.Add("文件:" + e.FullPath + " is copyed.");
}
private void button1_Click(object sender, EventArgs e)
{
this.folderBrowserDialog1.ShowDialog();
textBox2.Text = folderBrowserDialog1.SelectedPath.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
//监测USB文件夹的变化,并复制至制定文件夹
private void button3_Click(object sender, EventArgs e)
{
}
}
}