#include #include #include void RemoveReadOnlyAttribute(const wchar_t* path) { DWORD attributes = GetFileAttributesW(path); if (attributes != INVALID_FILE_ATTRIBUTES) { attributes &= ~FILE_ATTRIBUTE_READONLY; // Remove read-only attribute if (!SetFileAttributesW(path, attributes)) { perror("Error setting file attributes"); wprintf(L"Error code: %lu\n", GetLastError()); exit(EXIT_FAILURE); } } else { perror("Error getting file attributes"); wprintf(L"Error code: %lu\n", GetLastError()); exit(EXIT_FAILURE); } } void DeleteFilesInFolder(const wchar_t* folderPath) { wchar_t searchPath[MAX_PATH]; swprintf(searchPath, MAX_PATH, L"%ls\\*", folderPath); WIN32_FIND_DATA findFileData; HANDLE hFind = FindFirstFileW(searchPath, &findFileData); if (hFind == INVALID_HANDLE_VALUE) { perror("Error finding files"); wprintf(L"Error code: %lu\n", GetLastError()); exit(EXIT_FAILURE); } do { const wchar_t* fileName = findFileData.cFileName; if (!(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { wchar_t filePath[MAX_PATH]; swprintf(filePath, MAX_PATH, L"%ls\\%ls", folderPath, fileName); RemoveReadOnlyAttribute(filePath); if (!DeleteFileW(filePath)) { perror("Error deleting file"); wprintf(L"Error code: %lu\n", GetLastError()); exit(EXIT_FAILURE); } } } while (FindNextFileW(hFind, &findFileData) != 0); FindClose(hFind); } int main() { const wchar_t* folderPath = L"C:\\Users\\SEEDAGX\\source\\repos\\DeleteFolder\\DeleteFolder\\test"; RemoveReadOnlyAttribute(folderPath); DeleteFilesInFolder(folderPath); if (RemoveDirectoryW(folderPath)) { wprintf(L"Folder deleted successfully.\n"); } else { if (GetLastError() == ERROR_DIR_NOT_EMPTY) { wprintf(L"Error deleting folder: Directory not empty.\n"); } else { perror("Error deleting folder"); wprintf(L"Error code: %lu\n", GetLastError()); } exit(EXIT_FAILURE); } return 0; }