/** * The recursive helper function. It deletes all files inside specified * directory and calls itself to delete subdirectories. * * @param pDirName the directory to delete * @param pSep system-dependent file separator */ void do_cleanup(const pcsl_string* pDirName, const pcsl_string* pSep) { void* fileList = NULL; pcsl_string fileName = PCSL_STRING_NULL; pcsl_string dirName = PCSL_STRING_NULL; // add tailing file separator to directory name if (pcsl_string_cat(pDirName, pSep, &dirName) != PCSL_STRING_OK) { return; } fileList = pcsl_file_openfilelist(&dirName); if (fileList == NULL) { pcsl_string_free(&dirName); return; } // iterate over the directory's content while (!pcsl_file_getnextentry(fileList, &dirName, &fileName)) { int isDir = pcsl_file_is_directory(&fileName); if (isDir == 1) { // make recursion do_cleanup(&fileName, pSep); } else { // remove file pcsl_file_unlink(&fileName); } pcsl_string_free(&fileName); }; pcsl_string_free(&dirName); pcsl_file_closefilelist(fileList); // remove empty directory pcsl_file_rmdir(pDirName); }
/** * Tests for pcsl_file_is_directory(), pcsl_file_mkdir() and pcsl_file_rmdir(). */ void testDirectories() { int res; res = pcsl_file_is_directory(&dir1); assertTrue("\".\" is not recognized as a directory", res == 1); res = pcsl_file_is_directory(&dummy1); assertTrue("Non-existent directory is erroneously found", res != 1); res = pcsl_file_mkdir(&dir3); assertTrue("mkdir failed", res == 0); res = pcsl_file_is_directory(&dir3); assertTrue("Directory wasn't created", res == 1); res = pcsl_file_mkdir(&dir3); assertTrue("mkdir succeeded for directory that already exists", res != 0); res = pcsl_file_rmdir(&dir3); assertTrue("rmdir failed", res == 0); res = pcsl_file_is_directory(&dir3); assertTrue("Directory wasn't deleted", res != 1); res = pcsl_file_rmdir(&dummy1); assertTrue("rmdir succeeded for non-exisent directory", res != 0); }