当有U盘插入时,读取U盘中的所有文件

声明接受WindowProc消息的处理函数,
1、如果消息是WM_DEVICHANGE则有磁盘更改消息,那么将进行处理
2、如果参数lparam是DEV_BROADCAST_HDR结构,进行下一步处理,否则不处理
3、如果该结构的dbch_devicetype是DBT_DEVTYE_VOLUME,那么进行处理,否则不处理
4、如果PDEV_BROADCAST_VOLUME结构的dbcv_flags和DBTF_MEDIA安慰与为0则确定为U盘,否则可能是移动光驱之类
  1. LRESULT CImportExportDlg::WindowProc(UINT message,WPARAM wParam,LPARAM lParam)
  2. {
  3.     if(message == WM_DEVICECHANGE)
  4.     {
  5.         CString str;
  6.         DEV_BROADCAST_HDR *dbr = (DEV_BROADCAST_HDR*)lParam;
  7.         if(wParam == DBT_DEVICEARRIVAL)
  8.         {
  9.             if(dbr->dbch_devicetype == DBT_DEVTYP_VOLUME)
  10.             {
  11.                 PDEV_BROADCAST_VOLUME pbv = (PDEV_BROADCAST_VOLUME)dbr;
  12.                 if(pbv->dbcv_flags & DBTF_MEDIA)
  13.                 {
  14.                 }
  15.                 else
  16.                 {
  17.                     str.Format(L"有U盘 盘符为 %c 插入",this->FirstDriveFormMask(pbv->dbcv_unitmask));
  18.                     CString opr("://");
  19.                     this->SearchAndShowFiles(this->FirstDriveFormMask(pbv->dbcv_unitmask) + opr);
  20.                 }
  21.             }
  22.         }
  23.         if(wParam == DBT_DEVICEREMOVECOMPLETE)
  24.         {
  25.             if(dbr->dbch_devicetype == DBT_DEVTYP_VOLUME)
  26.             {
  27.                 PDEV_BROADCAST_VOLUME pbv = (PDEV_BROADCAST_VOLUME)dbr;
  28.                 if(pbv->dbcv_flags & DBTF_MEDIA)
  29.                 {}
  30.                 else
  31.                 {
  32.                     str.Format(L"U盘 盘符为 %c 被拔除",this->FirstDriveFormMask(pbv->dbcv_unitmask));                  
  33.                     this->m_list.DeleteAllItems();
  34.                 }
  35.             }
  36.         }
  37.     }
  38.     return CDialog::WindowProc(message,wParam,lParam);
  39. }
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux读取U盘或者移动硬序列号并获取U盘或者移动硬分区名。基本原理如下: 当有外置 USB 插入候,会产生 /proc/scsi/usb-storage 目录,并在其产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。 相应的 /sys/class/scsi_device/ 目录会有 scsi 设备的目录(ide 硬默认无子目录,sata硬默认有子目录),以数字开头(形如 1:0:0:0 2:0:0:0) 这个数字与前面 /proc/scsi/usb-storage目录的相对应,子目录表示sata硬。比如 /sys/class/scsi_device/2:0:0:0/device/block 有USB设备,从该目录下得到U盘或者移动硬的分区名,比如sda1。 该demo实现了上述过程,先检查 /proc/scsi/usb-storage 目录,看是否有u盘或者移动硬接入,如果有则读取u盘或者移动硬的序列号,然后在/sys/class/scsi_device/目录下逐级查找,直到找到u盘或者移动硬的分区。 完整代码,可直接编译和测试,嵌入式环境下也是适应的。 在linux测试如下,id表示序列号,sdb1表示是分区名称: # ./a.out udisk dev num:0 udisk id:055CE21B ret:0 dev num:0 found dir:0:0:0:1 found dev dir:0:0:0:1,full path:/sys/class/scsi_device/0:0:0:1 sub founction found dir:sda found sd device dir:sda,full path:/sys/class/scsi_device/0:0:0:1/device/block/sda found dir:0:0:0:2 found dev dir:0:0:0:2,full path:/sys/class/scsi_device/0:0:0:2 sub founction found dir:sdb found sd device dir:sdb,full path:/sys/class/scsi_device/0:0:0:2/device/block/sdb found sd sub device dir:sdb1 found dir:0:0:0:0 found dev dir:0:0:0:0,full path:/sys/class/scsi_device/0:0:0:0 sub funciton Open Directory /sys/class/scsi_device/0:0:0:0/device/block Error:No such file or directory get name return:0,disk name:sdb1 # 因为有的USB设备会有好几个,比如把CD和U盘集成到一起,就会出现上面的情况,有多个子目录去查找。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值