int GetDirContents(char *strDirName, PT_DirContent **pptDirContents, int *piNumber)
{
PT_DirContent *aptDirContents;
struct dirent **aptNameList;
int iNumber;
int i;
int j;
/* 扫描目录,结果按名字排序,存在aptNameList[0],aptNameList[1],... */
iNumber = scandir(strDirName, &aptNameList, 0, alphasort);
if (iNumber < 0)
{
DBG_PRINTF("scandir error : %s!\n", strDirName);
return -1;
}
/* 忽略".", ".."这两个目录 */
aptDirContents = malloc(sizeof(PT_DirContent) * (iNumber - 2)); // 分配多个目录的内存,这里只存放了指向多个目录的地址
if (NULL == aptDirContents)
{
DBG_PRINTF("malloc error!\n");
return -1;
}
*pptDirContents = aptDirContents;
for (i = 0; i < iNumber - 2; i++)
{
aptDirContents[i] = malloc(sizeof(T_DirContent)); // 分配单个目录的内存
if (NULL == aptDirContents)
{
DBG_PRINTF("malloc error!\n");
return -1;
}
}
/* 先把目录挑出来存入aptDirContents */
for (i = 0, j = 0; i < iNumber; i++)
{
/* 忽略".",".."这两个目录 */
if ((0 == strcmp(aptNameList[i]->d_name, ".")) || (0 == strcmp(aptNameList[i]->d_name, "..")))
continue;
/* 并不是所有的文件系统都支持d_type, 所以不能直接判断d_type */
/* if (aptNameList[i]->d_type == DT_DIR) */
if (isDir(strDirName, aptNameList[i]->d_name))
{
strncpy(aptDirContents[j]->strName, aptNameList[i]->d_name, 256);
aptDirContents[j]->strName[255] = '\0';
aptDirContents[j]->eFileType = FILETYPE_DIR;
free(aptNameList[i]);
aptNameList[i] = NULL;
j++;
}
}
/* 再把常规文件挑出来存入aptDirContents */
for (i = 0; i < iNumber; i++)
{
if (aptNameList[i] == NULL)
continue;
/* 忽略".",".."这两个目录 */
if ((0 == strcmp(aptNameList[i]->d_name, ".")) || (0 == strcmp(aptNameList[i]->d_name, "..")))
continue;
/* 并不是所有的文件系统都支持d_type, 所以不能直接判断d_type */
/* if (aptNameList[i]->d_type == DT_REG) */
if (isRegFile(strDirName, aptNameList[i]->d_name))
{
strncpy(aptDirContents[j]->strName, aptNameList[i]->d_name, 256);
aptDirContents[j]->strName[255] = '\0';
aptDirContents[j]->eFileType = FILETYPE_FILE;
free(aptNameList[i]);
aptNameList[i] = NULL;
j++;
}
}
/* 释放aptDirContents中未使用的项 */
for (i = j; i < iNumber - 2; i++)
{
free(aptDirContents[i]);
}
/* 释放scandir函数分配的内存 */
for (i = 0; i < iNumber; i++)
{
if (aptNameList[i])
{
free(aptNameList[i]);
}
}
free(aptNameList);
*piNumber = j;
return 0;
} 就是pptDirContents和aptDirContents这两个变量