通过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);