linux c程序实现获取U盘的名字(卷标/盘符)

27 篇文章 0 订阅
19 篇文章 0 订阅

一、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 上程序运行结果
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值