一、U盘的卷标
在linux系统下,显示的U盘的卷标如下图所示:
在linux系统下,显示的U盘的盘符如下图所示:
获取U盘的卷标是通过命令blkid -s LABEL来实现,执行完shell命令,在标准输出中就显示
/dev/sda1: LABEL=ESD-USB
其中 /dev/sda1 是指U盘的设备节点,LABEL=ESD-USB 是指U盘的卷标名,就是U盘的名字吧,可以通过自己的重命名来改变的。
二、通过linux c代码来实现获取U盘的卷标
开发环境是QtCreator
代码和注释如下
#include "widget.h"
#include "ui_widget.h"
#include <stdlib.h>
#include <string.h>
#include <QDebug>
#define MAX_USB_NUM 3
#define MAX_RESULT_LEN 100
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
//这里利用popen函数执行 blkid -s LABLE 命令,
//并获取到命令运行后标准输出的字符串
//返回值是shell命令的返回值
int Widget::mySystem()
{
FILE * fp;
int res,n=0;
char resultStr[MAX_RESULT_LEN] = {"0"};
//执行预先设定的命令,并读出该命令的标准输出
fp = popen("blkid -s LABEL", "r");
if(fp == NULL)
{
perror("popen fail");
printf("popen error: %s/n", strerror(errno));
return -1;
}
else
{
resultList.clear();
//shell命令执行后,读取标准输出的字符串,一行一行读
while(fgets(resultStr, MAX_RESULT_LEN, fp) != NULL)
{
//删除每一行的换行符
if('\n' == resultStr[strlen(resultStr)-1])
{
resultStr[strlen(resultStr)-1] = '\0';
}
//resultStr保存的就是标准输出一行的字符串
resultListr<<QString(QLatin1String(resultStr));
}
/*等待命令执行完毕并关闭管道及文件指针*/
res = pclose(fp);
if ( res == -1)
{
printf("close popen file pointer fp error!\n");
return -1;
}
else
{
printf("popen res is :%d\n", res);
return res;
}
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
int ret = 0;
ret = mySystem();
ui->comboBox->clear();
if( -1 == ret)
{
ui->comboBox->addItem("mySystem 执行失败");
ui->comboBox->addItem(QString("%1").arg(ret));
}else
{
//对每一行标准输出字符串进行解析,如字符串为(/dev/sda1: LABEL=ESD-USB)
for(int n = 0; n<resultList.length ();n++)
{
QString str = (resultList.at(n).section(":",0,0)).replace(QString("dev"),QString("media")).trimmed();
QString item = (resultList.at(n).section (":",1,1)).section("=",1,1)
.replace(QString("\""),QString("")).trimmed();
ui->comboBox->addItem(item);
qDebug()<<str; // 这个就打印出了U盘的挂载路径了:如:/media/sda1
qDebug()<<item;// 这个就打印出了U盘的卷标了:如:ESD-USB
}
}
}
Qt 上程序运行结果