檔案系統目錄操作函式
阿新 • • 發佈:2020-12-09
技術標籤:MP3播放方案
typedef struct { FSIZE_t fsize; / *檔案大小* / WORD fdate; / *最後修改日期* / WORD ftime; / *最後修改時間* / BYTE fattrib; / *屬性* / #if FF_USE_LFN TCHAR altname[FF_SFN_BUF +1]; / *替代物件名稱* / TCHAR fname [FF_LFN_BUF +1]; / *主要物件名稱* / #else TCHAR fname [12 +1]; / *物件名稱* / #endif } FILINFO;
http://elm-chan.org/fsw/ff/doc/sfileinfo.html
typedef struct { FFOBJID obj; / *物件識別符號* / DWORD dptr; / *當前讀/寫偏移量* / DWORD clust; / *當前叢集* / LBA_t sect; / *當前扇區* / BYTE *dir; / *指向win []中當前SFN條目的指標* / BYTE * fn; / *指向SFN緩衝區的指標(輸入/輸出){file [8],ext [3],status [1]} * / #if FF_USE_LFN DWORD blk_ofs; / *入口塊的偏移量(0xFFFFFFFF:Invalid)* / WCHAR * lfn; / *指向LFN工作緩衝區的指標(輸入/輸出)* / #endif #if FF_USE_FIND const TCHAR * pat; / *匹配模式的Ponter * / #endif } DIR; http://elm-chan.org/fsw/ff/doc/sdir.html
f_opendir函式開啟一個目錄。
FRESULT f_opendir(
DIR * dp, / * [OUT]指向目錄物件結構的指標* /
const TCHAR *path/ * [IN]目錄名* /
);
f_readdir函式讀取目錄的專案。
FRESULT f_readdir(
DIR * dp, / * [IN]目錄物件* /
FILINFO * fno / * [OUT]檔案資訊結構* /
);
FRESULT f_rewinddir(
DIR * dp, / * [IN]目錄物件* /
);
f_findfirst函式在目錄中搜索專案。
FRESULT f_findfirst(
DIR * dp, / * [OUT]指向目錄物件* /
FILINFO * fno, / * [OUT]指向檔案資訊結構的指標* /
const TCHAR * path, / * [IN]指向要作為目錄名稱的指標開啟* /
const TCHAR * pattern / * [IN]指向匹配模式字串的指標* /
);
f_findnext函式搜尋下一個匹配的物件
FRESULT f_findnext(
DIR * dp, / * [IN]指向目錄物件* /
FILINFO * fno / * [OUT]指向檔案資訊結構的指標* /
);
/* Search a directory for objects and display it */
void find_image_file (void)
{
FRESULT fr; /* Return value */
DIR dj; /* Directory object */
FILINFO fno; /* File information */
fr = f_findfirst(&dj, &fno, "", "dsc*.jp*"); /* Start to search for photo files */
while (fr == FR_OK && fno.fname[0]) { /* Repeat while an item is found */
printf("%s\n", fno.fname); /* Print the object name */
fr = f_findnext(&dj, &fno); /* Search for next item */
}
f_closedir(&dj);
}
//在某個目錄下,查詢相同型別的檔案
int find_test(void)
{
FRESULT res;
DIR dir2;
FILINFO fno2;
res = f_findfirst(&dir2, &fno2, "0:/MUSIC", "A*.mp3");
while(FR_OK == res && 0 != fno2.fname[0])
{
printf("%s\n",fno2.fname);
fr = f_findnext(&dir2, &fno2);
}
}
DIR dir1;
FILINFO fno1;
char path[256] = {0};
UINT i =0;
FRESULT scan_files (char* path)
{
res = f_opendir(&dir1, path);
if(FR_OK == res)
{
for(;;)
{
res = f_readdir(&dir1, &fno1); //讀目錄
if(FR_OK != res || 0 == fno1.fname[0]) break; ///* Break on error or end of dir */
if(fno1.fattrib & AM_DIR) //屬性為目錄
{
i = strlen(path);
if('.' != fno1.fname[0]) //. .. AA2
{
sprintf(&path[i], "/%s", fno1.fname);
res = scan_files(path);
if(FR_OK != res) break;
path[i] = 0;
}
}
else
{
printf("%s %s\n",path, fno1.fname); //0:/AA1/AA2/AA3 df.txt
}
}
//f_closedir(&dir1);
}
return res;
}
int dir_test(void)
{
strcpy(path, "0:/AA1");
res = scan_files(path);
return res;
}