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 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-21
  • 2021-04-27
  • 2021-11-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案