利用fatfs進行文件管理

STM32 fatfs庫進行文件管理

在嵌入式系統開發中,經常需要利用SD卡存儲一些系統配置文件、系統log文件。查閱一些資料發現fatfs庫有很多例程,而且官方文檔也非常清晰,但是仍然會遇到很多。套用天下無賊裏的一句臺詞,21世紀什麼最可靠,—記博客最可靠!
廢話不多說,開始上乾貨!利用fatfs,做一個基於時間的文件管理系統。
格式:

  • 根目錄下創建項目文件夾,表明你這個文件是幹嘛的
  • 在項目文件夾下創建時間文件夾,表明這些文件夾是那一天創建的
  • 在時間文件夾下,創建所要記錄的文件
  • 爲了確保SD內存不溢出,可以通過管理文件數量,來控制內存佔用

開始貼代碼

    f_mount(0,&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[0]) 
            break;
            if(fno.fname[0]=='.')
            continue;
            memset(temp_path,0,39); /*< 清理緩存區*/
            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 = 0, fre_sect = 0;
    /* 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 0;
    }


    /* Get free sectors */
    fre_sect = fre_clust * fs->csize;
    freeCap = fre_sect/2048; // 這裏剩餘內存就獲得了

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章