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