linux c程式實現獲取U盤的名字(卷標/碟符)
阿新 • • 發佈:2018-11-28
一、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 上程式執行結果