天天看點

利用fatfs進行檔案管理STM32 fatfs庫進行檔案管理

STM32 fatfs庫進行檔案管理

在嵌入式系統開發中,經常需要利用SD卡存儲一些系統配置檔案、系統log檔案。查閱一些資料發現fatfs庫有很多例程,而且官方文檔也非常清晰,但是仍然會遇到很多。套用天下無賊裡的一句台詞,21世紀什麼最可靠,—記部落格最可靠!

廢話不多說,開始上幹貨!利用fatfs,做一個基于時間的檔案管理系統。

格式:

  • 根目錄下建立項目檔案夾,表明你這個檔案是幹嘛的
  • 在項目檔案夾下建立時間檔案夾,表明這些檔案夾是那一天建立的
  • 在時間檔案夾下,建立所要記錄的檔案
  • 為了確定SD記憶體不溢出,可以通過管理檔案數量,來控制記憶體占用

開始貼代碼

f_mount(,&fs); //利用f_mount挂載SD卡
    f_mkdir(file_main_path); //利用f_mkdir建立一個檔案夾
    f_mkdir(file_path); //利用f_mkdir建立子檔案夾,這裡主要是通過file_path實作。
    FileOpenForRD(readme_path, &gfhReadMe); //打開一個檔案,如果這個檔案不存在就建立,并傳回一個檔案操作句柄,以便對檔案進行寫操作
    f_lseek(&gfhReadMe,f_size(&gfhReadMe)); //找到檔案結尾
    FileWrite(&gfhReadMe, readme_buf, strlen(readme_buf));//寫你想要寫入的檔案
    f_close(&gfhReadMe);//如果不是一直操作,可以先關閉檔案,減少資源占用
           

以上是一個簡單的檔案夾及檔案的建立以及讀寫過程,下面将對檔案夾進行管理。

為了友善管理和使用者需求,我們可以将老的檔案夾删除

f_opendir(&dirs, path);//利用f_opendir打開需要管理的檔案夾
    f_readdir(&dirs, &finfo);//利用f_read_dir依次讀出檔案夾名,并将讀出的檔案夾名儲存下來,通過一些邏輯判斷哪些是需要的檔案夾,哪些是需要删除的檔案夾,因為f_readdir是按字元串大小順序讀的,是以你存下來的檔案名也是有一定順序的,這樣對時間判斷上就沒必要做額外的工作了

    if(FR_OK==f_opendir(&dir, path)){ /*< 檔案夾路徑存在 */
        while(f_readdir(&dir, &fno) == FR_OK) 
        {
            if(!fno.fname[]) 
            break;
            if(fno.fname[]=='.')
            continue;
            memset(temp_path,,); /*< 清理緩存區*/
            sprintf(temp_path, "%s/%s",path, fno.fname); //得到檔案路徑
            res = f_unlink(temp_path); /*< 删除檔案 */

        }
        f_unlink(path); /*< 删除檔案夾 */
    }
    f_chdir("0:"); //退回到根目錄,如果不退回,下次建立檔案會導緻STM32當機,系統文檔中寫f_opendir是随時退出的,有點不靠譜,這個坑調一天,紀念下!
           

有了上訴操作,就可以保證檔案始終處于一個相對穩定的水準,想進一步進行管理,可以利用記憶體做最安全的管理。

下面貼出讀取記憶體的代碼:

static unsigned int Get_SD_Remain_Memery(void)
{
    FATFS *fs = NULL;
    DWORD fre_clust = , fre_sect = ;
    /* Get drive information and free clusters */

    unsigned char res = f_getfree("0", &fre_clust, &fs);

    if (res)
    {
        Printf("failed to get SD memery information, err NO.%u.\n",res);
        return ;
    }


    /* Get free sectors */
    fre_sect = fre_clust * fs->csize;
    freeCap = fre_sect/; // 這裡剩餘記憶體就獲得了

    /* Print free space in unit of KB _MAX_SS = 512B/sector) */

    Printf("%lu KB available.\n",fre_sect / );
    return ;
}
           

前人栽樹,後人乘涼,希望對後人有參考價值。