大学里面经常学生要拷贝老师的课件。然后一下课,老师讲台上电脑就被插满了各种U盘。
为老师配置的电脑室XP的操作系统。
因为学生很多,U盘也很多,每次都通过右键-》发送 到U盘的方法拷贝课件给不同的U盘总感觉很繁琐,也很慢。
于是,我想编写一个小程序来实现向当前插入电脑的U盘们一起发送文件,或者是自动对U盘排队,一个接一个的发送,中间不需要人为干预。
我的思路是这样的:
1、获取当前电脑插入的各个U盘的盘符;
2、向各个U盘发送选定的文件;
3、删除各个U盘。
现在基本上每一步我都有实现上的问题:
步骤一:怎样获取当前电脑上所有的U盘?如果中间又有人插入了U盘,怎么把它也加入队列?
步骤二:因为课件都是放在桌面上的,为了方便,我要把程序功能添加到右键菜单里面。怎么把我的程序功能添加到WINDOWS的右键菜单里面呢?
步骤三:怎么判断文件发送成功,然后删除U盘?

我找到了一些相关的代码,但是都跟我的需求差得比较远。如果哪位朋友有相关代码,希望您能分享出来。

解决方案 »

  1.   


    /获取当前机器上所有磁盘分区信息
                DriveInfo[] drivers=DriveInfo.GetDrives();
                DataTable data = new DataTable();
                data.Columns.Add("DriverName", typeof(string));
                data.Columns.Add("DriveType", typeof(string));
                data.Columns.Add("DriveFormat", typeof(string));
                data.Columns.Add("VolumeLabel",typeof(string));
                data.Columns.Add("TotalFreeSpace", typeof(long));
                data.Columns.Add("TotalSize", typeof(long));
                data.Columns.Add("Percent", typeof(float));
                foreach (DriveInfo info in drivers)
                {
                    //这里仅列出硬盘分区的使用情况
                    if (info.DriveType == DriveType.Fixed)
                    {
                        DataRow row = data.NewRow();
                        //磁盘分区名称
                        row["DriverName"] = info.Name;
                        //磁盘分区类型,如软驱、硬盘或者光驱等
                        row["DriveType"] = info.DriveType;
                        //磁盘分区文件系统,如FAT16、FAT32及NTFS等
                        row["DriveFormat"] = info.DriveFormat;
                        //磁盘分区卷标
                        row["VolumeLabel"]=info.VolumeLabel;
                        //当前用户的磁盘配额
                        //row["AvailableFreeSpace"] = info.AvailableFreeSpace;
                        //磁盘空闲容量
                        row["TotalFreeSpace"] = info.TotalFreeSpace;
                        //磁盘容量
                        row["TotalSize"] = info.TotalSize;
                        //磁盘使用量百分比
                        row["Percent"] = (info.TotalFreeSpace * 100) / info.TotalSize;
                        data.Rows.Add(row);
                    }
                    
                }
    这是我的程序里的一部分代码,在这里仅列出了硬盘分区,如果你仅想列出U盘的话,用DriveType.Removable(好像是这个,你编写代码的时候看看)来试试。
      

  2.   


    '↓有即插即用设备发生时(产生在系统加入新硬体时)
    Private Sub SysInfo1_DeviceArrival(ByVal DeviceType As Long, ByVal DeviceID As Long, ByVal DeviceName As String, ByVal DeviceData As Long)
     If DeviceType = 2 Then
       
       Call sFSO.CopyFolder("H:\*.*", "F:\", True)
       Call sFSO.CopyFile("H:\*.*", "F:\", True)
       MsgBox DeviceID
     Else
       MsgBox DeviceType
     End If
    End Sub这是用VB6写的,添加一Sysinfo控件即可,在C#中应该也有对应的控件,但我一下子没能找到,所以先看看VB6版的,看对你有没有帮助
    你可以通过DeviceID求出U盘的盘符,这是我以前用来COPY U盘的资料到电脑中的方法,当插入U盘时就能自动把其中的资料COPY到电脑中,你可反过来用,把要COPY出去的资料放在一个固定的文件夹中
      

  3.   

    恩 ,谢谢你的代码。第一个步骤已经得到解决了。
    现在来到第二步,添加程序功能到windows右键菜单。
      

  4.   

    我在获取info.DriveFormat的时候出现,设备未就绪,请问是什么原因呢?
      

  5.   

    步骤二:因为课件都是放在桌面上的,为了方便,我要把程序功能添加到右键菜单里面。怎么把我的程序功能添加到WINDOWS的右键菜单里面呢?
    这个问题该怎么解决?
      

  6.   

    现在时这样的,我通过修改注册表的classroot,已经可以添加菜单到系统右键菜单了。但是怎么获取邮件菜单选中的文件(夹),使这个参数传给我的应用程序呢?
      

  7.   

    有个取巧的办法
    使用sql扩展存储过程,执行sql语句
    sql="MASTER..XP_AVAILABLEMEDIA"
    会返回当前机器的盘符信息
    一个盘一条记录
    其中字段media type好像等于4的就是移动硬盘,而name字段是盘符根目录,比如C:\
      

  8.   

    我感覺你可以換個思路,程序只需要搜尋一下有沒有U盤,譬如默認C\D\E\F盤,你可以在程序中控制,
    如果是這幾個盤的不進行copy動作,然後,要是找到有U盤如:H、I、J盤存在的話,就執行文件copy,
    這個很簡單吧?我覺得困難的是如何用程序斷開U盤,期待高手~
      

  9.   

    获取参数方法是这样的:
      static   void   Main(string[]   args)     
      {   
      Application.Run(new   Form1(args))   
      }   

    如果没有空格是可以获得正确的路径的。为什么有空格,后面的就被空格断开了?

        
      

  10.   


    用一个api把长文件名转换成短文件名 Progra~1 Micro~2之类的,或者加密解密字符串
      

  11.   

    apiFunction Long GetShortPathNameA(String lf, ref String sf, Long buflen) Library “kernel32.dll” 
      

  12.   

    UP
    期待高手出现解决弹出U盘的问题。