1. 程式人生 > >linux c程式實現獲取U盤的名字(卷標/碟符)

linux c程式實現獲取U盤的名字(卷標/碟符)

一、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 上程式執行結果
在這裡插入圖片描述
在這裡插入圖片描述