]>
Commit | Line | Data |
---|---|---|
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 |
9 | FRESULT 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 |
54 | int 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 |