U盘检测-linux+QT

目录

  • 方法一:Liunx
    • 11usb.cpp
    • 效果
  • 方法二:Liunx+QT
    • udisk.cpp
    • udisk.h
    • ui
    • 结构
    • 效果
  • 文件
  • 参考
  • 改进参考

注意:本人U盘已经使用​ sudo mkfs.ntfs /dev/sdb1 U盘分区格式化

方法一:Liunx

  1. 检测U盘是否存在
  2. 检测U盘自动挂载还是需要手动挂载

11usb.cpp

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
//执行一个shell命令,输出结果逐行存储在resvec中,并返回行数
int32_t myexec(const char *cmd, vector<string> &resvec)
{resvec.clear();FILE *pp = popen(cmd, "r"); //建立管道if (!pp){return -1;}char tmp[1024]; //设置一个合适的长度,以存储每一行输出while (fgets(tmp, sizeof(tmp), pp) != NULL){if (tmp[strlen(tmp) - 1] == '\n'){tmp[strlen(tmp) - 1] = '\0'; //去除换行符}resvec.push_back(tmp);}pclose(pp); //关闭管道for (int i = 0; i < resvec.size(); i++){cout << resvec.at(i) << endl;cout << "-----------------------------" << endl;}return resvec.size();
}
int main(int argc, char const *argv[])
{printf("%s------------%d\n", __FUNCTION__, __LINE__);// 1.判断U盘是否存在DIR *dir_ptr;int usb_bool = 0;struct dirent *direntp;if ((dir_ptr = opendir("/proc/scsi/usb-storage")) == NULL){printf("down=0 %p \n", dir_ptr);usb_bool = 0; //拔下来的时候一定要清0}else //存储设备是插上了{usb_bool = 1;printf("up=1  %p \n", dir_ptr);// 2.找出sd**for (int i = 0; i < 6; i++){const char *sdx[] = {"sda", "sdb", "sdc", "sdd", "sde", "sdf"};char open_path[64] = {0};sprintf(open_path, "/sys/block/%s/removable", sdx[i]);printf("open_path==[%s]\n", open_path);// 3.判断磁盘是否属于U盘int fd = open(open_path, O_RDONLY);if (fd == -1){printf("open error------------%d\n", __LINE__);// 打开失败}else{char buf[32] = {0};if (read(fd, buf, sizeof(buf)) > 0)//读{printf("buf==[%s]-strlen(buf)=%d\n", buf, (int)strlen(buf));printf("buf==[%c]\n", buf[0]);if (buf[0] == '1')//属于U盘{printf("is USB------------%d\n", __LINE__);// 如果已经自动挂载,找到目录,拷贝就行vector<string> resvec;char df_path[64] = {0};sprintf(df_path,"df -h|grep /dev/%s", sdx[i]);myexec(df_path, resvec);//执行df_path,把显示结果赋给resvecif (resvec.size() == 0)// 执行df_path,没有结果,需要手动挂载{printf("no USB------df -h|grep /dev/------%d\n", __LINE__);// 手动挂载,创建挂载目录usbsystem("mkdir -p /mnt/usb"); // -p目录早已存在则不当作错误system("mount -t ntfs /dev/sdb1 /mnt/usb/");//挂载system("cp /mnt/hgfs/share-2/demo/11usb.cpp /mnt/usb/");system("umount /mnt/usb/");// 取消挂载break;}else{cout << resvec.back() << endl;char *str = (char *)resvec.back().c_str();const char s[2] = " ";char path[128] = {0};char *token;token = strtok(str, " "); //获取第一个子字符串while (token != NULL){ //继续获取其他的子字符串printf("%s\n", token);strcpy(path, token);token = strtok(NULL, s);}printf("path==[%s]\n", path);int ret = system("cp /mnt/hgfs/share-2/demo/11usb.cpp /mnt/usb/");printf("is USB--ret==%d----------%d\n", ret, __LINE__);break;}        }else{printf("no USB------------%d\n", __LINE__);}}}close(fd);}closedir(dir_ptr);}return 0;
}

效果

  • df -h

在这里插入图片描述

  • 执行程序
  • 没有插U盘
    在这里插入图片描述
  • 插U盘
  • sdb是U盘(图片注释打错了)

在这里插入图片描述

方法二:Liunx+QT

  1. 检测U盘是否存在
  2. 检测U盘自动挂载还是需要手动挂载

udisk.cpp

建议使用QFile QString QVector ,由于时间成本因素,还是沿用上面的代码

#include "udisk.h"
#include "ui_udisk.h"
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <string.h>
#include <vector>
Udisk::Udisk(QWidget *parent): QWidget(parent), ui(new Ui::Udisk)
{ui->setupUi(this);this->setWindowTitle("U盘检测");
}Udisk::~Udisk()
{delete ui;
}int32_t Udisk::myexec(const char *cmd, std::vector<std::string> &resvec)
{resvec.clear();FILE *pp = popen(cmd, "r"); //建立管道if (!pp){return -1;}char tmp[1024]; //设置一个合适的长度,以存储每一行输出while (fgets(tmp, sizeof(tmp), pp) != NULL){if (tmp[strlen(tmp) - 1] == '\n'){tmp[strlen(tmp) - 1] = '\0'; //去除换行符}resvec.push_back(tmp);}pclose(pp); //关闭管道for (int i = 0; i<(int)resvec.size(); i++){ui->textBrowser->append(QString(resvec.at(i).c_str()));}return resvec.size();
}void Udisk::on_checkBtn_clicked()
{ui->textBrowser->clear();// 1.判断U盘是否存在DIR *dir_ptr;int usb_bool = 0;if ((dir_ptr = opendir("/proc/scsi/usb-storage")) == NULL){ui->textBrowser->append("U盘不存在");usb_bool = 0; //拔下来的时候一定要清0}else //存储设备是插上了{usb_bool = 1;ui->textBrowser->append("U盘存在");// 2.找出sd**for (int i = 0; i < 6; i++){const char *sdx[] = {"sda", "sdb", "sdc", "sdd", "sde", "sdf"};char open_path[64] = {0};sprintf(open_path, "/sys/block/%s/removable", sdx[i]);// 3.判断磁盘是否属于U盘int fd = open(open_path, O_RDONLY);if (fd == -1){ui->textBrowser->append("打开失败:"+QString(open_path));}else{char buf[32] = {0};if (read(fd, buf, sizeof(buf)) > 0)//读{ui->textBrowser->append("读取:"+QString(open_path)+"  ["+QString(buf[0])+"]");if (buf[0] == '1')//属于U盘{ui->textBrowser->append("["+QString(sdx[i])+"]是U盘");// 如果已经自动挂载,找到目录,拷贝就行char cmd[32]={0};std::vector<std::string> resvec;char df_path[64] = {0};sprintf(df_path,"df -h|grep /dev/%s", sdx[i]);myexec(df_path, resvec);//执行df_path,把显示结果赋给resvecif (resvec.size() == 0)// 执行df_path,没有结果,需要手动挂载{ui->textBrowser->append(QString(df_path)+"没有结果,需要手动挂载");ui->textBrowser->append("手动挂载");// 手动挂载,创建挂载目录usbsystem("mkdir -p /mnt/usb"); // -p目录早已存在则不当作错误sprintf(cmd,"mount -t ntfs /dev/%s1 /mnt/usb/", sdx[i]);system(cmd);//挂载//system("cp /mnt/hgfs/share-2/demo/11usb.cpp /mnt/usb/");system("umount /mnt/usb/");// 取消挂载break;}else{ui->textBrowser->append("自动挂载:"+QString(resvec.back().c_str()));char *str = (char *)resvec.back().c_str();const char s[2] = " ";char path[128] = {0};char *token;token = strtok(str, " "); //获取第一个子字符串while (token != NULL){ //继续获取其他的子字符串strcpy(path, token);token = strtok(NULL, s);}ui->textBrowser->append("挂载路径["+QString(path)+"]");//system("cp /mnt/hgfs/share-2/demo/11usb.cpp /mnt/usb/");break;}}else{ui->textBrowser->append("["+QString(sdx[i])+"]不是U盘");}}}// QWidget::close()与stdio.h中的文件关闭标准函数close()产生了歧义// 区分成员函数与全局函数,就要在全局函数前面增加"::"双冒号的标志::close(fd);}closedir(dir_ptr);}
}

udisk.h

#ifndef UDISK_H
#define UDISK_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Udisk; }
QT_END_NAMESPACEclass Udisk : public QWidget
{Q_OBJECTpublic:Udisk(QWidget *parent = nullptr);~Udisk();//执行一个shell命令,输出结果逐行存储在resvec中,并返回行数int32_t myexec(const char *cmd, std::vector<std::string> &resvec);private slots:void on_checkBtn_clicked();// 使用ui设计器的转到槽private:Ui::Udisk *ui;
};
#endif // UDISK_H

ui

在这里插入图片描述

结构

在这里插入图片描述

效果

  • df -h
    在这里插入图片描述

  • 执行程序

  • 没有插U盘
    在这里插入图片描述

  • 插U盘
    在这里插入图片描述

文件

有道云:U盘检测源码

参考

根目录定义|硬件设备在linux下的命名

利用/proc/scsi/usb-storage来判断 U盘的移入/移出

判断磁盘是否属于U盘

获取U盘挂载路径

C++ strtok函数详解|字符串分割

挂载U盘

改进参考

Linux下如何用QT检测到U盘已经插入

Linux c检测USB热插拔(netlink)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68543.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标文件太大,放不进U盘

当你想把电脑的文件放进U盘&#xff0c;但是提示文件太大放不进U盘怎么办&#xff08;如图1-1&#xff09;&#xff1f; 图1-1 解决方法如下&#xff1a; 1、找到电脑&#xff0c;点击鼠标右键&#xff0c; 2、选择格式化 3、将文件系统从默认的"FAT32"改成"…

U盘常见的两种故障解决方案,朋友们快来码住

U盘被我们用来储存文件资料&#xff0c;因为它可以随身携带&#xff0c;所以我们常会用到。用得多了它就容易出一些故障&#xff0c;今天我带来U盘数据损坏和无法读取这两种常见故障的解决方法&#xff0c;需要的朋友就码住吧。 故障一&#xff1a;U盘无法打开 如果你将U盘接…

【日常小问题1】U盘写入速度变慢的解决方法(适用于win10)

Author: AXYZdong 自动化专业 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性 Time&#xff1a;2020-02-28 欢迎转载分享 电脑内存不够&#xff0c;先把一些不常用的大文件转到U盘里&#xff0c;发现U盘写入速度只有几百KB&#xff0c;有点慢哦。百度了一下&a…

U盘拷贝文件很慢?稍微改变一下使用方式,传输速度就快了6倍

随着云端网盘的快速发展和普遍推广&#xff0c;现在基本是以云存储为主&#xff0c;不过u盘还是必不可缺的小工具&#xff0c;不需要网络支持就能够轻松实现复制内容。 有网友问怎么样才能提高u盘的传输速度&#xff0c;传个6G的文件&#xff0c;花了十几分钟&#xff0c;速度好…

为什么我的U盘传到一半速度会变成0然后过一会儿才回继续

反复横跳 &#xff0c;就像在画波浪线 甚至删除时也会降到0 这是U盘问题&#xff0c;还是设置的问题

linux写u盘速度变慢,闪迪CZ80 U盘速度变慢怎么办恢复方法

闪迪CZ80是一个好U盘&#xff0c;很多人都买它来放数据&#xff0c;小编也不例外&#xff0c;但不知道为什么CZ80用过一段时间以后会速度下降&#xff0c;表现是写入速度极低且不稳定&#xff0c;极端情况下3.0下照样掉到个位数。其实这个盘本身是有终身保修的&#xff0c;如果…

从计算机复制u盘慢怎么解决方法,复制到U盘的速度越来越慢怎么办?

复制到U盘的速度越来越慢怎么办&#xff1f; 一般来说&#xff0c;电脑的文件复制到U盘速度是比较快的。那么出现速度越来越慢这种情况的话我们该怎么办呢?下面是聚优经验网小编给大家收集整理的复制到U盘的速度越来越慢怎么办&#xff0c;欢迎阅读。 1、资源管理器窗口中&…

一个小龙盘等于300个u盘

近日&#xff0c;一款名为小龙盘的黑科技产品正式上市&#xff0c;让人惊叹的是其10T超大容量、价格实惠的特点。据了解&#xff0c;小龙盘的容量相当于300个普通常用USB存储盘的容量&#xff0c;能够轻松存储各种大型文件&#xff0c;如高清电影、电子书等等。超实惠的价格就可…

从计算机复制u盘慢怎么解决方法,U盘传输速度慢怎么办 u盘传文件慢的解决办法-电脑教程...

U盘传输速度慢怎么办&#xff1f;相信不少朋友也会遇到这种问题。就像小编近期遇到的问题一样&#xff0c;在将下载好的Win7系统镜像文件下载到电脑中后&#xff0c;传输到制作好的U盘启动盘时&#xff0c;发现其传输速度不足5MB/s&#xff0c;如下图。这对于一个近4GB系统镜像…

第13章项目资源管理

项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程&#xff0c;这些过程有助于确保项目经理和项目团队在正确的时间和地点使用正确的资源。   项目资源是指对于项目来说&#xff0c;一切具有使用价值&#xff0c;可为项目接受和利用&#xff0c;且属于项目发…

哈工大团队开源医学智能问诊大模型 | 华佗: 基于中文医学知识的LLaMa指令微调模型

原文&#xff1a; CVHub 门头沟学院AI视觉实验室御用公众号 | 学术 | 科研 | 就业 185篇原创内容 公众号 Title: HuaTuo: Tuning LLaMA Model with Chinese Medical KnowledgePDF: https://arxiv.org/pdf/2304.06975v1.pdfCode: https://github.com/scir-hi/huatuo-llama-me…

彻底凉了!全球最大电子书网站遭美政府封站

【导读】全球最大免费数字图书馆Z-Library已经被美国查封。免费下小说的、下教材的&#xff0c;这下怕是要另找地方了。 最新报道显示&#xff0c;号称是世界上最大的免费电子图书馆Z-Library&#xff0c;已经被美国查封&#xff0c;相关的数个域名全部无法访问&#xff01; …

全球饲料行业发展现状及趋势分析,亚太地区产量最高「图」

一、饲料分类 饲料是指能提供动物所需营养素&#xff0c;促进动物生长、生产和健康&#xff0c;且在合理使用下安全、有效的可饲物质。按照产品特征划分&#xff0c;饲料可分为配合饲料、浓缩饲料和添加剂预混合饲料。按产品品种分&#xff0c;饲料又可分为猪饲料、蛋禽饲料、…

水产养殖4G智能监测方案的作用和优势

传统水产养殖中&#xff0c;全部操作都需要由人工完成&#xff0c;费时费力。随着技术发展&#xff0c;万物互联的时代来临。水产养殖智能化监控方案系统可根据水质需要自动换水&#xff0c;增氧泵&#xff0c;监测水温、光照、PH值、浊度、电导等。养殖管理员也可以根据系统提…

搞水产的人都笑了,智慧水产养殖水质监测解决方案

一、行业背景随着近年来经济的飞速发展&#xff0c;水产行业也在飞速崛起。但随着养殖密度不断加大&#xff0c;养殖环境在逐渐日益恶化&#xff0c;养殖成本还在持续上涨&#xff0c;传统的养殖模式已无法满足现代水产养殖业的发展要求&#xff0c;设施智能化养殖势在必行。许…

[省级大创项目]教育类APP的探索和实践——大学物理实验助手APP开发

立项依据&#xff08;项目背景及研究现状500字以内&#xff09; 通过网上问卷等形式做了前期调研&#xff0c;网上问卷由问卷星提供技术支持&#xff0c;共有348份答卷&#xff0c;问卷链接为很抱歉&#xff0c;此问卷(12931895)已暂停&#xff0c;不能填写&#xff01;。 &…

微信小程序如何调用后台接口

本课程讲解了微信小程序如何调用线上API中心接口&#xff0c;主要使用了wx.request去和API中心交互&#xff0c;API中心提供给了下面的几个接口:接口是用JFinal开发封装jfinal 用key-value形式存取数据。 API中心还提供了接口测试工具&#xff0c;可以在线调试API接口。 APP数据…

微信小程序---客服消息接口调用,拿来即用

如果本文对你有用&#xff0c;请爱心点个赞&#xff0c;提高排名&#xff0c;帮助更多的人。谢谢大家&#xff01;❤ 如果解决不了&#xff0c;可以在文末进群交流。 在页面中使用 <button open-type"contact" /> 可以显示进入客服会话按钮。 <button open…

chatgpt赋能python:Python自动答题:让答题变得简单

Python自动答题&#xff1a;让答题变得简单 越来越多的人喜欢参加各种各样的答题比赛&#xff0c;但是答题有时会变得很困难&#xff0c;特别是当你不知道答案的时候。好在我们有Python自动答题程序&#xff0c;可以轻松解决这个问题。 什么是Python自动答题程序&#xff1f;…

当心!经济学家分析:未来三年内做好随时失业的准备

AI人工智能又来抢饭碗了&#xff0c;这次竟然通过了公认难考的会计行业考试&#xff01; 近期&#xff0c;OpenAI的大语言模型最新版GPT-4已经完成美国注册会计师&#xff08;简称CPA&#xff09;考试&#xff0c;四大主要会计考试所有科目的平均得分为85.1。 而在CPA考试中&…