1 /*-----------------------------------------------------------------------*/ 2 /* Get Number of Free Clusters */ 3 /*-----------------------------------------------------------------------*/ 4 5 FRESULT f_getfree ( 6 const TCHAR *path, /* Pointer to the logical drive number (root dir) */ 7 DWORD *nclst, /* Pointer to the variable to return number of free clusters */ 8 FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ 9 ) 10 { 11 FRESULT res; 12 DWORD n, clst, sect, stat; 13 UINT i; 14 BYTE fat, *p; 15 16 17 /* Get drive number */ 18 res = chk_mounted(&path, fatfs, 0); 19 if (res == FR_OK) { 20 /* If free_clust is valid, return it without full cluster scan */ 21 if ((*fatfs)->free_clust <= (*fatfs)->n_fatent - 2) { 22 *nclst = (*fatfs)->free_clust; 23 } else { 24 /* Get number of free clusters */ 25 fat = (*fatfs)->fs_type; 26 n = 0; 27 if (fat == FS_FAT12) { 28 clst = 2; 29 do { 30 stat = get_fat(*fatfs, clst); 31 if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } 32 if (stat == 1) { res = FR_INT_ERR; break; } 33 if (stat == 0) n++; 34 } while (++clst < (*fatfs)->n_fatent); 35 } else { 36 clst = (*fatfs)->n_fatent; 37 sect = (*fatfs)->fatbase; 38 i = 0; p = 0; 39 do { 40 if (!i) { 41 res = move_window(*fatfs, sect++); 42 if (res != FR_OK) break; 43 p = (*fatfs)->win; 44 i = SS(*fatfs); 45 } 46 if (fat == FS_FAT16) { 47 if (LD_WORD(p) == 0) n++; 48 p += 2; i -= 2; 49 } else { 50 if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; 51 p += 4; i -= 4; 52 } 53 } while (--clst); 54 } 55 (*fatfs)->free_clust = n; 56 if (fat == FS_FAT32) (*fatfs)->fsi_flag = 1; 57 *nclst = n; 58 } 59 } 60 LEAVE_FF(*fatfs, res); 61 }
相关文章: