Deleting a directory along with sub-folders






2.98/5 (22 votes)
Function that deletes whole of a directory structure.
Introduction
First of all, let me tell you that this is my first contribution to CodeProject though I have been programming in C++ for more than five years now. Having said that, I think, I have good reasons to keep my first article short and simple for beginners.
Deleting a directory structure
The Windows API RemoveDirectory()
function deletes an existing empty directory. If the directory is not empty, function fails with a return value zero. But most of the times, we call a function for removing a directory, what we want is to delete the directory structure completely including all files and sub-folders in it.
If you want this, there's DeleteDirectory()
function to achieve it.
Source Code
BOOL DeleteDirectory(const TCHAR* sPath) { HANDLE hFind; // file handle WIN32_FIND_DATA FindFileData; TCHAR DirPath[MAX_PATH]; TCHAR FileName[MAX_PATH]; _tcscpy(DirPath,sPath); _tcscat(DirPath,"\\*"); // searching all files _tcscpy(FileName,sPath); _tcscat(FileName,"\\"); hFind = FindFirstFile(DirPath,&FindFileData); // find the first file if(hFind == INVALID_HANDLE_VALUE) return FALSE; _tcscpy(DirPath,FileName); bool bSearch = true; while(bSearch) { // until we finds an entry if(FindNextFile(hFind,&FindFileData)) { if(IsDots(FindFileData.cFileName)) continue; _tcscat(FileName,FindFileData.cFileName); if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { // we have found a directory, recurse if(!DeleteDirectory(FileName)) { FindClose(hFind); return FALSE; // directory couldn't be deleted } RemoveDirectory(FileName); // remove the empty directory _tcscpy(FileName,DirPath); } else { if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) _chmod(FileName, _S_IWRITE); // change read-only file mode if(!DeleteFile(FileName)) { // delete the file FindClose(hFind); return FALSE; } _tcscpy(FileName,DirPath); } } else { if(GetLastError() == ERROR_NO_MORE_FILES) // no more files there bSearch = false; else { // some error occured, close the handle and return FALSE FindClose(hFind); return FALSE; } } } FindClose(hFind); // closing file handle return RemoveDirectory(sPath); // remove the empty directory }
DeleteDirectory()
function uses a small companion IsDot()
for checking '.' and '..' directory entries.
BOOL IsDots(const TCHAR* str) { if(_tcscmp(str,".") && _tcscmp(str,"..")) return FALSE; return TRUE; }
Explanation
DeleteDirectory()
is a recursive function which navigates through a directory structure using FindFirstFile()
and FindNextFile()
APIs. If it finds a file, it deletes it. On the other hand, if it finds a directory entry, it just calls itself to recursively delete the directory. It returns TRUE
on success and FALSE
on failure.
That's all there's to it.