[ros-diffs] [hpoussin] 30835: Support real deletion of directories from the recycle bin

hpoussin at svn.reactos.org hpoussin at svn.reactos.org
Wed Nov 28 10:32:15 CET 2007


Author: hpoussin
Date: Wed Nov 28 12:32:14 2007
New Revision: 30835

URL: http://svn.reactos.org/svn/reactos?rev=30835&view=rev
Log:
Support real deletion of directories from the recycle bin

Modified:
    trunk/reactos/lib/recyclebin/readme.txt
    trunk/reactos/lib/recyclebin/recyclebin_v5.c

Modified: trunk/reactos/lib/recyclebin/readme.txt
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/recyclebin/readme.txt?rev=30835&r1=30834&r2=30835&view=diff
==============================================================================
--- trunk/reactos/lib/recyclebin/readme.txt (original)
+++ trunk/reactos/lib/recyclebin/readme.txt Wed Nov 28 12:32:14 2007
@@ -2,7 +2,6 @@
 It is aimed to be compatible with Windows 2000/XP/2003 (at least) on FAT or NTFS volumes.
 
 TODO
-- Empty a recycle bin containing directories (v5)
 - Set security on recycle bin folder
 - Make the library thread-safe
 

Modified: trunk/reactos/lib/recyclebin/recyclebin_v5.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/recyclebin/recyclebin_v5.c?rev=30835&r1=30834&r2=30835&view=diff
==============================================================================
--- trunk/reactos/lib/recyclebin/recyclebin_v5.c (original)
+++ trunk/reactos/lib/recyclebin/recyclebin_v5.c Wed Nov 28 12:32:14 2007
@@ -17,7 +17,11 @@
 	IN LPCWSTR FullName)
 {
 	DWORD RemovableAttributes = FILE_ATTRIBUTE_READONLY;
+	WIN32_FIND_DATAW FindData;
+	HANDLE hSearch = INVALID_HANDLE_VALUE;
+	LPWSTR FullPath = NULL, pFilePart;
 	DWORD FileAttributes;
+	SIZE_T dwLength;
 	BOOL ret = FALSE;
 
 	FileAttributes = GetFileAttributesW(FullName);
@@ -34,11 +38,46 @@
 	}
 	if (FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
 	{
-		/* Recursive deletion */
-		/* FIXME: recursive deletion */
-		SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-		goto cleanup;
-
+		/* Prepare file specification */
+		dwLength = wcslen(FullName);
+		FullPath = HeapAlloc(GetProcessHeap(), 0, (dwLength + 1 + MAX_PATH + 1) * sizeof(WCHAR));
+		if (!FullPath)
+		{
+			SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+			goto cleanup;
+		}
+		wcscpy(FullPath, FullName);
+		if (FullPath[dwLength - 1] != '\\')
+		{
+			FullPath[dwLength] = '\\';
+			dwLength++;
+		}
+		pFilePart = &FullPath[dwLength];
+		wcscpy(pFilePart, L"*");
+
+		/* Enumerate contents, and delete it */
+		hSearch = FindFirstFileW(FullPath, &FindData);
+		if (hSearch == INVALID_HANDLE_VALUE)
+			goto cleanup;
+		do
+		{
+			if (!(FindData.cFileName[0] == '.' &&
+				(FindData.cFileName[1] == '\0' || (FindData.cFileName[1] == '.' && FindData.cFileName[2] == '\0'))))
+			{
+				wcscpy(pFilePart, FindData.cFileName);
+				if (!IntDeleteRecursive(FullPath))
+				{
+					FindClose(hSearch);
+					goto cleanup;
+				}
+			}
+		}
+		while (FindNextFileW(hSearch, &FindData));
+		FindClose(hSearch);
+		if (GetLastError() != ERROR_NO_MORE_FILES)
+			goto cleanup;
+
+		/* Remove (now empty) directory */
 		if (!RemoveDirectoryW(FullName))
 			goto cleanup;
 	}
@@ -50,6 +89,7 @@
 	ret = TRUE;
 
 cleanup:
+	HeapFree(GetProcessHeap(), 0, FullPath);
 	return ret;
 }
 




More information about the Ros-diffs mailing list