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