]> cloudbase.mooo.com Git - z180-stamp.git/blame - fatfs/documents/res/app2.c
Import fatfs R0.15
[z180-stamp.git] / fatfs / documents / res / app2.c
CommitLineData
53668523 1/*------------------------------------------------------------/\r
5630b930
L
2/ Delete a sub-directory even if it contains any file\r
3/-------------------------------------------------------------/\r
4/ The delete_node() function is for R0.12+.\r
5/ It works regardless of FF_FS_RPATH.\r
6*/\r
53668523
L
7\r
8\r
5630b930
L
9FRESULT delete_node (\r
10 TCHAR* path, /* Path name buffer with the sub-directory to delete */\r
11 UINT sz_buff, /* Size of path name buffer (items) */\r
12 FILINFO* fno /* Name read buffer */\r
53668523
L
13)\r
14{\r
15 UINT i, j;\r
16 FRESULT fr;\r
17 DIR dir;\r
53668523 18\r
5630b930
L
19\r
20 fr = f_opendir(&dir, path); /* Open the sub-directory to make it empty */\r
21 if (fr != FR_OK) return fr;\r
22\r
23 for (i = 0; path[i]; i++) ; /* Get current path length */\r
24 path[i++] = _T('/');\r
25\r
26 for (;;) {\r
27 fr = f_readdir(&dir, fno); /* Get a directory item */\r
28 if (fr != FR_OK || !fno->fname[0]) break; /* End of directory? */\r
29 j = 0;\r
30 do { /* Make a path name */\r
31 if (i + j >= sz_buff) { /* Buffer over flow? */\r
32 fr = 100; break; /* Fails with 100 when buffer overflow */\r
53668523 33 }\r
5630b930
L
34 path[i + j] = fno->fname[j];\r
35 } while (fno->fname[j++]);\r
36 if (fno->fattrib & AM_DIR) { /* Item is a sub-directory */\r
37 fr = delete_node(path, sz_buff, fno);\r
38 } else { /* Item is a file */\r
53668523 39 fr = f_unlink(path);\r
53668523 40 }\r
5630b930 41 if (fr != FR_OK) break;\r
53668523
L
42 }\r
43\r
5630b930
L
44 path[--i] = 0; /* Restore the path name */\r
45 f_closedir(&dir);\r
46\r
47 if (fr == FR_OK) fr = f_unlink(path); /* Delete the empty sub-directory */\r
53668523
L
48 return fr;\r
49}\r
50\r
51\r
52\r
5630b930
L
53\r
54int main (void) /* How to use */\r
53668523
L
55{\r
56 FRESULT fr;\r
57 FATFS fs;\r
5630b930
L
58 TCHAR buff[256];\r
59 FILINFO fno;\r
53668523
L
60\r
61\r
5630b930 62 f_mount(&fs, _T("5:"), 0);\r
53668523 63\r
5630b930
L
64 /* Directory to be deleted */\r
65 _tcscpy(buff, _T("5:dir"));\r
53668523 66\r
5630b930
L
67 /* Delete the directory */\r
68 fr = delete_node(buff, sizeof buff / sizeof buff[0], &fno);\r
53668523 69\r
5630b930 70 /* Check the result */\r
53668523 71 if (fr) {\r
5630b930 72 _tprintf(_T("Failed to delete the directory. (%u)\n"), fr);\r
53668523
L
73 return fr;\r
74 } else {\r
5630b930 75 _tprintf(_T("The directory and the contents have successfully been deleted.\n"), buff);\r
53668523
L
76 return 0;\r
77 }\r
78}\r
79\r
80\r
81\r