private static bool DeleteDirectoryTree(ref Win32.WIN32_FIND_DATA fd, string dir, StringBuilder sb) { IntPtr hFind = NativeMethods.FindFirstFile(Path.Combine(dir, "*"), out fd); if (hFind == NativeMethods.INVALID_HANDLE_VALUE) { return(false); } do { if (fd.cFileName == "." || fd.cFileName == "..") { continue; //pseudo-directory } string path = Path.Combine(dir, fd.cFileName); if ((fd.dwFileAttributes & FileAttributes.ReadOnly) != 0) { NativeMethods.SetFileAttributes(path, fd.dwFileAttributes & ~FileAttributes.ReadOnly); } if ((fd.dwFileAttributes & FileAttributes.Directory) != 0) { DeleteDirectoryTree(ref fd, path, sb); NativeMethods.RemoveDirectory(path); continue; } if (!NativeMethods.DeleteFile(path) && sb != null) { sb.AppendFormat("{0} : {1}\r\n", path, Win32Exception.GetLastErrorMessage()); } } while (NativeMethods.FindNextFile(hFind, out fd)); NativeMethods.FindClose(hFind); return(NativeMethods.RemoveDirectory(dir)); }