1. 程式人生 > 其它 >檔案系統目錄操作函式

檔案系統目錄操作函式

技術標籤: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; 
}