]>
Commit | Line | Data |
---|---|---|
5630b930 L |
1 | /*----------------------------------------------------------------------/\r |
2 | / Test if the file is contiguous /\r | |
3 | /----------------------------------------------------------------------*/\r | |
4 | \r | |
5 | FRESULT test_contiguous_file (\r | |
6 | FIL* fp, /* [IN] Open file object to be checked */\r | |
7 | int* cont /* [OUT] 1:Contiguous, 0:Fragmented or zero-length */\r | |
8 | )\r | |
9 | {\r | |
10 | DWORD clst, clsz, step;\r | |
11 | FSIZE_t fsz;\r | |
12 | FRESULT fr;\r | |
13 | \r | |
14 | \r | |
15 | *cont = 0;\r | |
16 | fr = f_rewind(fp); /* Validates and prepares the file */\r | |
17 | if (fr != FR_OK) return fr;\r | |
18 | \r | |
19 | #if FF_MAX_SS == FF_MIN_SS\r | |
20 | clsz = (DWORD)fp->obj.fs->csize * FF_MAX_SS; /* Cluster size */\r | |
21 | #else\r | |
22 | clsz = (DWORD)fp->obj.fs->csize * fp->obj.fs->ssize;\r | |
23 | #endif\r | |
24 | fsz = f_size(fp);\r | |
25 | if (fsz > 0) {\r | |
26 | clst = fp->obj.sclust - 1; /* A cluster leading the first cluster for first test */\r | |
27 | while (fsz) {\r | |
28 | step = (fsz >= clsz) ? clsz : (DWORD)fsz;\r | |
29 | fr = f_lseek(fp, f_tell(fp) + step); /* Advances file pointer a cluster */\r | |
30 | if (fr != FR_OK) return fr;\r | |
31 | if (clst + 1 != fp->clust) break; /* Is not the cluster next to previous one? */\r | |
32 | clst = fp->clust; fsz -= step; /* Get current cluster for next test */\r | |
33 | }\r | |
34 | if (fsz == 0) *cont = 1; /* All done without fail? */\r | |
35 | }\r | |
36 | \r | |
37 | return FR_OK;\r | |
38 | }\r |