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));
        }