- Supported stdint.h for C99 and later. (integer.h was included in ff.h) - Fixed reading a directory gets infinite loop when the last directory entry is not empty. (appeared at R0.12) - Fixed creating a sub-directory in the fragmented sub-directory on the exFAT volume collapses FAT chain of the parent directory. (appeared at R0.12) - Fixed f_getcwd() cause output buffer overrun when the buffer has a valid drive number. (appeared at R0.13b)
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*------------------------------------------------------------/
 | |
| / Delete a sub-directory even if it contains any file
 | |
| /-------------------------------------------------------------/
 | |
| / The delete_node() function is for R0.12+.
 | |
| / It works regardless of FF_FS_RPATH.
 | |
| */
 | |
| 
 | |
| 
 | |
| FRESULT delete_node (
 | |
|     TCHAR* path,    /* Path name buffer with the sub-directory to delete */
 | |
|     UINT sz_buff,   /* Size of path name buffer (items) */
 | |
|     FILINFO* fno    /* Name read buffer */
 | |
| )
 | |
| {
 | |
|     UINT i, j;
 | |
|     FRESULT fr;
 | |
|     DIR dir;
 | |
| 
 | |
| 
 | |
|     fr = f_opendir(&dir, path); /* Open the sub-directory to make it empty */
 | |
|     if (fr != FR_OK) return fr;
 | |
| 
 | |
|     for (i = 0; path[i]; i++) ; /* Get current path length */
 | |
|     path[i++] = _T('/');
 | |
| 
 | |
|     for (;;) {
 | |
|         fr = f_readdir(&dir, fno);  /* Get a directory item */
 | |
|         if (fr != FR_OK || !fno->fname[0]) break;   /* End of directory? */
 | |
|         j = 0;
 | |
|         do {    /* Make a path name */
 | |
|             if (i + j >= sz_buff) { /* Buffer over flow? */
 | |
|                 fr = 100; break;    /* Fails with 100 when buffer overflow */
 | |
|             }
 | |
|             path[i + j] = fno->fname[j];
 | |
|         } while (fno->fname[j++]);
 | |
|         if (fno->fattrib & AM_DIR) {    /* Item is a sub-directory */
 | |
|             fr = delete_node(path, sz_buff, fno);
 | |
|         } else {                        /* Item is a file */
 | |
|             fr = f_unlink(path);
 | |
|         }
 | |
|         if (fr != FR_OK) break;
 | |
|     }
 | |
| 
 | |
|     path[--i] = 0;  /* Restore the path name */
 | |
|     f_closedir(&dir);
 | |
| 
 | |
|     if (fr == FR_OK) fr = f_unlink(path);  /* Delete the empty sub-directory */
 | |
|     return fr;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| int main (void) /* How to use */
 | |
| {
 | |
|     FRESULT fr;
 | |
|     FATFS fs;
 | |
|     TCHAR buff[256];
 | |
|     FILINFO fno;
 | |
| 
 | |
| 
 | |
|     f_mount(&fs, _T("5:"), 0);
 | |
| 
 | |
|     /* Directory to be deleted */
 | |
|     _tcscpy(buff, _T("5:dir"));
 | |
| 
 | |
|     /* Delete the directory */
 | |
|     fr = delete_node(buff, sizeof buff / sizeof buff[0], &fno);
 | |
| 
 | |
|     /* Check the result */
 | |
|     if (fr) {
 | |
|         _tprintf(_T("Failed to delete the directory. (%u)\n"), fr);
 | |
|         return fr;
 | |
|     } else {
 | |
|         _tprintf(_T("The directory and the contents have successfully been deleted.\n"), buff);
 | |
|         return 0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 |