file模块的主要功能 :
文件的映射操作及文件夹操作
文件模块只有一个文件file.c,前面是对文件的映射操作,后面是对文件夹的操作。
typedef struct FileMap {
char strFileName[256]; /* 文件名 */
// int iFd;
FILE * tFp; /* 文件句柄 */
int iFileSize; /* 文件大小 */
unsigned char *pucFileMapMem; /* 使用mmap函数映射文件得到的内存 */
}T_FileMap, *PT_FileMap;
使用mmap函数映射一个文件到内存,以后就可以直接通过内存来访问文件。
int MapFile(PT_FileMap ptFileMap){
int iFd;
FILE *tFp;
struct stat tStat;
tFp = fopen(ptFileMap->strFileName, "r+"); // 打开文件
ptFileMap->tFp = tFp;
fstat(iFd, &tStat); //获得统计信息
ptFileMap->iFileSize = tStat.st_size;
ptFileMap->pucFileMapMem = (unsigned char *)mmap(NULL , tStat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, iFd, 0); //映射文件
return 0;
}
void UnMapFile(PT_FileMap ptFileMap){
munmap(ptFileMap->pucFileMapMem, ptFileMap->iFileSize); //取消映射
fclose(ptFileMap->tFp); //关闭文件
}
static int isDir(char *strFilePath, char *strFileName) //判断一个文件是否为目录
static int isRegDir(char *strDirPath, char *strSubDirName) //判断一个目录是否常规的目录,在本程序中把sbin等目录当作特殊目录来对待
static int isRegFile(char *strFilePath, char *strFileName) //判断一个文件是否常规的文件,设备节点/链接文件/FIFO文件等是特殊文件
int GetDirContents(char *strDirName, PT_DirContent **pptDirContents, int *piNumber) //把某目录下所含的顶层子目录、顶层文件都记录下来,并且按名字排序
void FreeDirContents(PT_DirContent *aptDirContents, int iNumber) //GetDirContents的清理函数,用来释放内存
功能描述: 以深度优先的方式获得目录下的文件
即: 先获得顶层目录下的文件, 再进入一级子目录A
再获得一级子目录A下的文件, 再进入二级子目录AA, ...
处理完一级子目录A后, 再进入一级子目录B
"连播模式"下调用该函数获得要显示的文件
有两种方法获得这些文件:
1. 事先把所有文件的名字保存到某个缓冲区中
2. 用到时再去搜索取出若干个文件名
第1种方法比较简单,但是当文件很多时有可能导致内存不足.
我们使用第2种方法:
假设某目录(包括所有子目录)下所有的文件都给它编一个号
int GetFilesIndir(char *strDirName, int *piStartNumberToRecord, int *piCurFileNumber, int *piFileCountHaveGet, int iFileCountTotal, char apstrFileNames[][256])