通過C++我們讀取已經mount到裝置上的資料節點,讀取這個節點,将節點作為參數傳遞給shell腳本,最後通過shell腳本根據參數來選擇格式化哪一個盤。
具體實作過程:
1.初始化系統盤節點資訊,将所有資訊儲存在結構體中
/etc/mtab 檔案裡面儲存的是所有已經挂載上的盤符資訊,通過檔案方式逐行讀取并儲存到結構體數組中。
do{
fd = fopen(PARTITION_PATH,"r");
if(NULL == fd)
{
iOutRet = ERROR_FILE_OPEN_FAIL;
break;
}
while(fgets(Line, sizeof(Line),fd))
{
if(Index >= MAX_DISC_NUM)
{
iOutRet = ERROR_INVALID_PARAMETER;
break;
}
ZeroMemory(ptName,sizeof(ptName));
if (sscanf(Line, " %u %u %u %[^\n ]",&m_NodePartInfo[Index].major, &m_NodePartInfo[Index].minor,
&m_NodePartInfo[Index].size, ptName) != 4)
{
continue;
}
iRet = GetDevType(ptName,&m_NodePartInfo[Index].EDevType);
if(ERROR_SUCCESS != iRet)
{
iOutRet = iRet;
goto OUT_ERROR;
}
for(Start = ptName; *Start; Start++)
{
continue;
}
// LOG_BLINE(" %s dev %d\n",ptName,m_NodePartInfo[Index].EDevType);
if (Start[-1] >= '1' && Start[-1] <= '9')
{
}
else
{
m_NodePartInfo[Index].isRootNode = TRUE;
}
if(1 == m_NodePartInfo[Index].size)
{
m_NodePartInfo[Index].isExtPartition = TRUE;
}
strncpy(m_NodePartInfo[Index].NodePartName,ptName,strlen(ptName));
Index ++;
ZeroMemory(&Line,sizeof(Line));
}
if(0 == Index)
{
iOutRet = ERROR_NOT_FOUND;
break;
}
}
2.通過U盤格式和其它盤分開,擷取該u盤mount上的節點号。
一般U盤的格式為vfat 格式,我們通過strstr()函數找出每一個資料段中是否有vfat這個字元串,傳回值為1時,讀取字元串的第一個字元串,這個字元串即為它mount上的裝置節點。
3.将這個字元串的裝置節點通過參數傳遞給腳本,腳本來實作格式化該USB盤
strShellCmd.Format("%s %d %s usb",FDISKSH_PATH,option,rootNode);
system(strShellCmd);