/********************************************************************* * * _FillNode * * Function description * Recursive filling of node * * Parameters: * hTree - obvious * NumNodes - Number of child nodes to be created at each node * NumLeaves - Number of leaves to be created at each node * MaxDepth - Maximum depth (1.1.1.1.1.....) * CurDepth - Current depth * acBuffer - String to be used for TREEVIEW items * p - Pointer into to string to be used for numbering * * Return value: * 0 on success, 1 on error */ static int _FillNode(WM_HWIN hTree, TREEVIEW_ITEM_Handle hNode, int NumNodes, int NumLeaves, int MaxDepth, int CurDepth, char * acBuffer, char * p) { TREEVIEW_ITEM_Handle hItem; int i; int Position; hItem = 0; *(p + 1) = 0; *p = '0' - 1; if (--CurDepth) { // // Create nodes // for (i = 0; i < NumNodes; i++) { (*p)++; Position = hItem ? TREEVIEW_INSERT_BELOW : TREEVIEW_INSERT_FIRST_CHILD; hItem = TREEVIEW_ITEM_Create(1, acBuffer, 0); if (hItem == 0) { return 1; // Error } _NumNodes++; TREEVIEW_AttachItem(hTree, hItem, hNode, Position); hNode = hItem; *(p + 1) = '.'; p += 2; // // Recursive call of 'this' function for each node // _FillNode(hTree, hNode, NumNodes, NumLeaves, MaxDepth, CurDepth, acBuffer, p); p -= 2; *(p + 1) = 0; } } // // Create leaves // for (i = 0; i < NumLeaves; i++) { (*p)++; Position = hItem ? TREEVIEW_INSERT_BELOW : TREEVIEW_INSERT_FIRST_CHILD; hItem = TREEVIEW_ITEM_Create(0, acBuffer, 0); if (hItem == 0) { return 1; // Error } _NumLeaves++; TREEVIEW_AttachItem(hTree, hItem, hNode, Position); hNode = hItem; } return 0; }
/********************************************************************* * * _FillNode * * Purpose: * Recursive filling of node * * Parameters: * hTree - obvious * NumNodes - Number of child nodes to be created at each node * NumLeaves - Number of leaves to be created at each node * MaxDepth - Maximum depth (1.1.1.1.1.....) * CurDepth - Current depth * acBuffer - String to be used for TREEVIEW items * p - Pointer into to string to be used for numbering * * Return value: * 0 on success, 1 on error */ static int _FillNode(WM_HWIN hTree, TREEVIEW_ITEM_Handle hNode, int NumChildNodes, int NumChildItems, int MaxDepth, int Depth, char * p) { static char acBuffer[(TREEVIEW_DEPTH << 1) + 1]; TREEVIEW_ITEM_Handle hItem = 0; int i, j, Position; if (p == NULL) { p = acBuffer; } *(p + 1) = 0; *p = '0' - 1; if (--Depth) { // // Create nodes // for (i = 0; i < NumChildNodes; i++) { (*p)++; Position = hItem ? TREEVIEW_INSERT_BELOW : TREEVIEW_INSERT_FIRST_CHILD; hItem = TREEVIEW_ITEM_Create(1, acBuffer, 0); if (hItem == 0) { return 1; // Error } TREEVIEW_AttachItem(hTree, hItem, hNode, Position); hNode = hItem; *(p + 1) = '.'; p += 2; _FillNode(hTree, hNode, NumChildNodes, NumChildItems, MaxDepth, Depth, p); p -= 2; *(p + 1) = 0; } } // // Create leaves // for (j = 0; j < NumChildItems; j++) { (*p)++; Position = hItem ? TREEVIEW_INSERT_BELOW : TREEVIEW_INSERT_FIRST_CHILD; hItem = TREEVIEW_ITEM_Create(0, acBuffer, 0); if (hItem == 0) { return 1; // Error } TREEVIEW_AttachItem(hTree, hItem, hNode, Position); hNode = hItem; } return 0; }
/** * @brief scan_files 递归扫描sd卡内的文件 * @param path:初始扫描路径 file_name:指向用来存储文件名的一段空间 hFile:用于记录文件路径的文件指针 hTree 目录树 hNode 目录结点 * hTree == NULL && hNode == NULL 的话,不创建目录树 * @retval result:文件系统的返回值 */ static FRESULT scan_files (char* path,char* file_name,FIL *hFile,WM_HWIN hTree, TREEVIEW_ITEM_Handle hNode,int *fileNum) { FRESULT res; //部分在递归过程被修改的变量,不用全局变量 FILINFO fno; static uint32_t rw_num = 0; //已读或已写的字节数 //char showname[60]={0}; DIR dir; int i; char *fn; TREEVIEW_ITEM_Handle hItem=0; #if _USE_LFN static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1]; //长文件名支持 fno.lfname = lfn; fno.lfsize = sizeof(lfn); #endif res = f_opendir(&dir, path); //打开目录 if (res == FR_OK) { i = strlen(path); for (;;) { res = f_readdir(&dir, &fno); //读取目录下的内容 if (res != FR_OK || fno.fname[0] == 0) break; //为空时表示所有项目读取完毕,跳出 #if _USE_LFN fn = *fno.lfname ? fno.lfname : fno.fname; #else fn = fno.fname; #endif if (*fn == '.') continue; //点表示当前目录,跳过 if (fno.fattrib & AM_DIR) { //目录,递归读取 if(hTree != NULL && hNode != NULL) { //hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_NODE,showname,0); hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_NODE,fn,0); //目录,创建结点 TREEVIEW_AttachItem(hTree,hItem,hNode,TREEVIEW_INSERT_FIRST_CHILD); //把结点加入到目录树中 } sprintf(&path[i], "/%s", fn); //合成完整目录名 res = scan_files(path,file_name,hFile,hTree,hItem,fileNum); //递归遍历 if (res != FR_OK) break; //打开失败,跳出循环 path[i] = 0; } else //是文件 { /* 根据要求是否创建目录树 */ if(hTree != NULL && hNode != NULL) //创建目录树 { //hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_LEAF,showname,0); hItem = TREEVIEW_ITEM_Create(TREEVIEW_ITEM_TYPE_LEAF,fn,0); //文件,创建树叶 TREEVIEW_AttachItem(hTree,hItem,hNode,TREEVIEW_INSERT_FIRST_CHILD); //把树叶添加到目录树 if (strlen(path)+strlen(fn)<BROWSER_FILE_NAME_LEN) { sprintf(file_name, "%s/%s", path,fn); //存储文件名到filelist(含路径) res = f_lseek (hFile, hItem*BROWSER_FILE_NAME_LEN); res = f_write (hFile, file_name, BROWSER_FILE_NAME_LEN, &rw_num); //printf("\nfileItem=%ld:%s",hItem,file_name); } } }//else } //for } return res; }