- Removed the exclusive deletion because '-' is a valid file name character.
- Optimized the recursive deletion in directories.
- Preload some nice strings.
Modified: trunk/reactos/subsys/system/cmd/del.c

Modified: trunk/reactos/subsys/system/cmd/del.c
--- trunk/reactos/subsys/system/cmd/del.c	2005-08-07 13:06:30 UTC (rev 17165)
+++ trunk/reactos/subsys/system/cmd/del.c	2005-08-07 13:59:05 UTC (rev 17166)
@@ -38,6 +38,11 @@
 *
 *    22-Jun-2005 (Brandon Turner <turnerb7@msu.edu>)
 *        Implemented /A   example "del /A:H /A:-R *.exe -ping.exe"
+*    
+*    07-Aug-2005 (Hartmut Birr)
+*        Removed the exclusive deletion (see two comments above) because '-' is a valid file name character. 
+*        Optimized the recursive deletion in directories. 
+*        Preload Loaded some nice strings.*       
 */
 
 #include <precomp.h>
@@ -72,185 +77,320 @@
 	ATTR_N_READ_ONLY = 0x080    /* /A:-R */
 };
 
+static TCHAR szDeleteWipe[RC_STRING_MAX_SIZE];
+static TCHAR szDelHelp2[RC_STRING_MAX_SIZE];
+static TCHAR szDelHelp3[RC_STRING_MAX_SIZE];
+static TCHAR szDelHelp4[RC_STRING_MAX_SIZE];
+static TCHAR szDelError5[RC_STRING_MAX_SIZE];
+static TCHAR szDelError6[RC_STRING_MAX_SIZE];
+static TCHAR szDelError7[RC_STRING_MAX_SIZE];
+static TCHAR CMDPath[MAX_PATH];
 
+static BOOLEAN StringsLoaded = FALSE;
 
+static VOID LoadStrings(VOID)
+{
+        LoadString( CMD_ModuleHandle, STRING_DELETE_WIPE, szDeleteWipe, RC_STRING_MAX_SIZE);
+        LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szDelHelp2, RC_STRING_MAX_SIZE);
+        LoadString( CMD_ModuleHandle, STRING_DEL_HELP3, szDelHelp3, RC_STRING_MAX_SIZE);
+        LoadString( CMD_ModuleHandle, STRING_DEL_HELP4, szDelHelp4, RC_STRING_MAX_SIZE);
+        LoadString( CMD_ModuleHandle, STRING_DEL_ERROR5, szDelError5, RC_STRING_MAX_SIZE);
+        LoadString( CMD_ModuleHandle, STRING_DEL_ERROR6, szDelError6, RC_STRING_MAX_SIZE);
+        LoadString( CMD_ModuleHandle, STRING_DEL_ERROR7, szDelError7, RC_STRING_MAX_SIZE);
+        GetModuleFileName(NULL, CMDPath, MAX_PATH);
+        StringsLoaded = TRUE;
+}
+
 static BOOL
-RemoveFile (LPTSTR lpFileName, DWORD dwFlags)
+RemoveFile (LPTSTR lpFileName, DWORD dwFlags, WIN32_FIND_DATA* f)
 {
 	/*This function is called by CommandDelete and
 	does the actual process of deleting the single 
 	file*/
 
-	if (dwFlags & DEL_WIPE)
-	{
 
-		HANDLE file;
-		DWORD temp;
-		LONG BufferSize = 65536;
-		BYTE buffer[BufferSize];
-		LONG i;
-		HANDLE fh;
-		WIN32_FIND_DATA f;
-		LONGLONG FileSize;
-		TCHAR szMsg[RC_STRING_MAX_SIZE];
+        /*check to see if it is read only and if this is done based on /A
+          if it is done by file name, access is denied. However, if it is done 
+          using the /A switch you must un-read only the file and allow it to be
+          deleted*/
+        if((dwFlags & DEL_ATTRIBUTES) || (dwFlags & DEL_FORCE))
+        {
+                if(f->dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+		{
+			/*setting file to normal, not saving old attrs first
+			  because the file is going to be deleted anyways
+			  so the only thing that matters is that it isnt
+			  read only.*/
+                        SetFileAttributes(lpFileName,FILE_ATTRIBUTE_NORMAL);
+                }
+        }
 
-		LoadString( CMD_ModuleHandle, STRING_DELETE_WIPE, szMsg, RC_STRING_MAX_SIZE);
+        if (dwFlags & DEL_WIPE)
+        {
 
-		fh = FindFirstFile(lpFileName, &f);
-		FileSize = ((LONGLONG)f.nFileSizeHigh * ((LONGLONG)MAXDWORD+1)) + (LONGLONG)f.nFileSizeLow;
+	        HANDLE file;
+	        DWORD temp;
+	        LONG BufferSize = 65536;
+	        BYTE buffer[BufferSize];
+	        LONGLONG i;
+	        LARGE_INTEGER FileSize;
 
-		for(i = 0; i < BufferSize; i++)
-		{
-			buffer[i]=rand() % 256;
-		}
-		file = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,  FILE_FLAG_WRITE_THROUGH, NULL);
-		for(i = 0; i < (FileSize - BufferSize); i += BufferSize)
-		{
-			WriteFile (file, buffer, BufferSize, &temp, NULL);
-			ConOutPrintf (_T("%I64d%% %s\r"),(i * (LONGLONG)100)/FileSize,szMsg);
-		}
-		WriteFile (file, buffer, FileSize - i, &temp, NULL);
-		ConOutPrintf (_T("100%% %s\n"),szMsg);
-		CloseHandle (file);
-	}
-	/*check to see if it is read only and if this is done based on /A
-	if it is done by file name, access is denied. However, if it is done 
-	using the /A switch you must un-read only the file and allow it to be
-	deleted*/
-	if((dwFlags & DEL_ATTRIBUTES) || (dwFlags & DEL_FORCE))
-	{
-		HANDLE hFile;
-		WIN32_FIND_DATA f2;
-		hFile = FindFirstFile(lpFileName, &f2);
-		if(f2.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
-		{
-			/*setting file to normal, not saving old attrs first
-			because the file is going to be deleted anyways
-			so the only thing that matters is that it isnt
-			read only.*/
-			SetFileAttributes(lpFileName,FILE_ATTRIBUTE_NORMAL);
-		}
+	        FileSize.u.HighPart = f->nFileSizeHigh;
+                FileSize.u.LowPart = f->nFileSizeLow;
 
-	}
+	        for(i = 0; i < BufferSize; i++)
+	        {
+		        buffer[i]=rand() % 256;
+	        }
+	        file = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,  FILE_FLAG_WRITE_THROUGH, NULL);
+                if (file != INVALID_HANDLE_VALUE)
+                {
+                        for(i = 0; i < (FileSize.QuadPart - BufferSize); i += BufferSize)
+		        {
+			        WriteFile (file, buffer, BufferSize, &temp, NULL);
+			        ConOutPrintf (_T("%I64d%% %s\r"),(i * (LONGLONG)100)/FileSize.QuadPart,szDeleteWipe);
+		        }
+		        WriteFile (file, buffer, FileSize.QuadPart - i, &temp, NULL);
+		        ConOutPrintf (_T("100%% %s\n"),szDeleteWipe);
+		        CloseHandle (file);
+                }
+        }
+
 	return DeleteFile (lpFileName);
 }
 
-BOOL _SearchPathex(TCHAR *lpPath,TCHAR *lpFileName,TCHAR *lpBuffer, DWORD dwFlags)
+
+static DWORD
+DeleteFiles(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags)
 {
-	TCHAR szFullPath[MAX_PATH];
-	WIN32_FIND_DATA f;
-	HANDLE hFile;
-	TCHAR CMDPath[MAX_PATH];
+        TCHAR szFullPath[MAX_PATH];
+        TCHAR szFileName[MAX_PATH];
+        LPTSTR pFilePart;
+        HANDLE hFile;
+        WIN32_FIND_DATA f;
+        BOOL bExclusion;
+        INT res;
+        DWORD dwFiles = 0;
 
+        _tcscpy(szFileName, FileName);
 
-	/* Make the Full Path Name */
-	_tcscpy(szFullPath,lpPath);
-	_tcscat(szFullPath,lpFileName);
+        if(_tcschr (szFileName, _T('*')) == NULL && 
+	   IsExistingDirectory (szFileName))
+        {
+	        /* If it doesnt have a \ at the end already then on needs to be added */
+		if(szFileName[_tcslen(szFileName) -  1] != _T('\\'))
+                        _tcscat (szFileName, _T("\\"));
+                /* Add a wildcard after the \ */
+                _tcscat (szFileName, _T("*"));
+        }
 
-	/* Open up the handle to the file(s) */
-	hFile = FindFirstFile(szFullPath, &f);
-	do
-	{
-		/* Build the full name again, this time using the handle
-		   as it might have had a * in the name before */
-		_tcscpy(szFullPath,lpPath);
-		_tcscat(szFullPath,f.cFileName);
+	if(!_tcscmp (szFileName, _T("*")) ||
+           !_tcscmp (szFileName, _T("*.*")) ||
+           (szFileName[_tcslen(szFileName) -  2] == _T('\\') && szFileName[_tcslen(szFileName) -  1] == _T('*')))
+        {
+                /* well, the user wants to delete everything but if they didnt yes DEL_YES, DEL_QUIET, or DEL_PROMPT
+	           then we are going to want to make sure that in fact they want to do that.  */
 
-		/* We cant delete . or .. */
-		if (!_tcscmp (f.cFileName, _T(".")) ||
-			!_tcscmp (f.cFileName, _T("..")))
-			continue;
+		if (!((*dwFlags & DEL_YES) || (*dwFlags & DEL_QUIET) || (*dwFlags & DEL_PROMPT)))
+	        {
+        	        res = FilePromptYNA (szDelHelp2);
+		        if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
+			        return 0x80000000;
+		        if(res == PROMPT_ALL)
+			        *dwFlags |= DEL_YES;
+	        }
+	}
 
-		/* We cant delete ourselves */
-		GetModuleFileName(NULL, CMDPath, MAX_PATH);
-		if(!_tcscmp (CMDPath,szFullPath))
-			continue;
+        GetFullPathName (FileName,
+                         MAX_PATH,
+                         szFullPath,
+                         &pFilePart);
 
-		/* If there is a read only / system file and they are forcing, then we can delete it
-		   But we must first set it to normal.  Otherwise we cant delete it */
-		if(((dwFlags & DEL_FORCE) || (dwFlags & DEL_ATTRIBUTES)) && ((f.dwFileAttributes & FILE_ATTRIBUTE_READONLY) || (f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)))
-		{
+        hFile = FindFirstFile(szFullPath, &f);
+        if (hFile != INVALID_HANDLE_VALUE)
+        {
+                do
+                {
+                        bExclusion = FALSE;
 
-			SetFileAttributes(szFullPath,FILE_ATTRIBUTE_NORMAL);
+		        /*if it is going to be excluded by - no need to check attrs*/
+		        if(*dwFlags & DEL_ATTRIBUTES && !bExclusion)
+		        {
 
-		}
-		else if(!((dwFlags & DEL_FORCE) || (dwFlags & DEL_ATTRIBUTES)) && ((f.dwFileAttributes & FILE_ATTRIBUTE_READONLY) || (f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)))
-			continue;
+			        /*save if file attr check if user doesnt care about that attr anyways*/
+			        if(dwAttrFlags & ATTR_ARCHIVE && !(f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE))
+				        bExclusion = TRUE;
+			        if(dwAttrFlags & ATTR_HIDDEN && !(f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
+				        bExclusion = TRUE;
+			        if(dwAttrFlags & ATTR_SYSTEM && !(f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
+				        bExclusion = TRUE;
+			        if(dwAttrFlags & ATTR_READ_ONLY && !(f.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
+			                bExclusion = TRUE;
+		                if(dwAttrFlags & ATTR_N_ARCHIVE && (f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE))
+			                bExclusion = TRUE;
+		                if(dwAttrFlags & ATTR_N_HIDDEN && (f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
+			                bExclusion = TRUE;
+		                if(dwAttrFlags & ATTR_N_SYSTEM && (f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
+			                bExclusion = TRUE;
+		                if(dwAttrFlags & ATTR_N_READ_ONLY && (f.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
+			                bExclusion = TRUE;
+	                }
 
-		/* If we find a file, we can return and continue to delete it */
-		if(IsExistingFile(szFullPath))
-		{
-			_tcscpy(lpBuffer,szFullPath);
-			CloseHandle(hFile);
-			return TRUE;
-		}
-	}while(FindNextFile (hFile, &f));
+	                if(bExclusion)
+		                continue;
 
-	CloseHandle(hFile);
+		        /* ignore directories */
+		        if (f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+		                continue;
 
-	/* None in this folder, so lets drop down to another folder */
-	_tcscat(lpPath,_T("*"));
-	hFile = FindFirstFile(lpPath, &f);
-	lpPath[_tcslen(lpPath) - 1] = _T('\0');
 
-	do
-	{
-		/* dont count this folder or the folder above */
-		if (!_tcscmp (f.cFileName, _T(".")) ||
-			!_tcscmp (f.cFileName, _T("..")))
-			continue;
+		        _tcscpy (pFilePart, f.cFileName);
 
-		/* Assemble full path to file */
-		_tcscpy(szFullPath,lpPath);
-		_tcscat(szFullPath,f.cFileName);
-		if(IsExistingDirectory(szFullPath))
-		{
-			_tcscat(szFullPath,_T("\\"));
-			/* If it is a directory, move into(Recurvsily) */
-			if(_SearchPathex(szFullPath,lpFileName,lpBuffer,dwFlags))
-			{
-				return TRUE;
-			}
+		        /* We cant delete ourselves */
+		        if(!_tcscmp (CMDPath,szFullPath))
+			        continue;
 
-		}
-	}while(FindNextFile (hFile, &f));
-	return FALSE;
+
+#ifdef _DEBUG
+		        ConErrPrintf(_T("Full filename: %s\n"), szFullPath);
+#endif
+
+		        /* ask for deleting */
+		        if (*dwFlags & DEL_PROMPT)
+		        {
+		                ConErrPrintf(szDelError5, szFullPath);
+
+		                res = FilePromptYN (szDelError6);
+
+		                if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
+		                {
+			                continue;  //FIXME: Errorcode?
+		                }
+	                }
+
+	                /*user cant ask it to be quiet and tell you what it did*/
+	                if (!(*dwFlags & DEL_QUIET) && !(*dwFlags & DEL_TOTAL))
+	                {
+		                ConErrPrintf(szDelError7, szFullPath);
+	                }
+
+	                /* delete the file */
+	                if(*dwFlags & DEL_NOTHING)
+		                continue;
+
+	                if(RemoveFile (szFullPath, *dwFlags, &f))
+		                dwFiles++;
+		        else
+                        {		
+		                ErrorMessage (GetLastError(), _T(""));
+//                                FindClose(hFile);
+//                                return -1;
+	                }
+                }
+                while (FindNextFile (hFile, &f));
+	        FindClose (hFile);
+        }
+        return dwFiles;
 }
 
 
+static DWORD 
+ProcessDirectory(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags)
+{
+        TCHAR szFullPath[MAX_PATH];
+        LPTSTR pFilePart;
+        LPTSTR pSearchPart;
+        HANDLE hFile;
+        WIN32_FIND_DATA f;
+        DWORD dwFiles = 0;
+
+        GetFullPathName (FileName,
+                         MAX_PATH,
+                         szFullPath,
+                         &pFilePart);
+
+        dwFiles = DeleteFiles(szFullPath, dwFlags, dwAttrFlags);
+        if (dwFiles & 0x80000000)
+                return dwFiles;
+
+        if (*dwFlags & DEL_SUBDIR)
+        {
+	        /* Get just the file name */
+	        pSearchPart = _tcsrchr(FileName,_T('\\'));
+	        if(pSearchPart != NULL)
+		        pSearchPart++;
+	        else
+		        pSearchPart = FileName;
+
+	        /* Get the full path to the file */
+	        GetFullPathName (FileName,MAX_PATH,szFullPath,NULL);
+
+	        /* strip the filename off of it */
+                pFilePart = _tcsrchr(szFullPath, _T('\\'));
+                if (pFilePart == NULL)
+                {
+                        pFilePart = szFullPath;
+                }
+                else
+                {
+                        pFilePart++;
+                }
+
+                _tcscpy(pFilePart, _T("*"));
+
+                hFile = FindFirstFile(szFullPath, &f);
+                if (hFile != INVALID_HANDLE_VALUE)
+                {
+                        do
+                        {
+       		                if (!(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
+                                    !_tcscmp(f.cFileName, _T(".")) ||
+                                    !_tcscmp(f.cFileName, _T("..")))
+		                        continue;
+
+                                _tcscpy(pFilePart, f.cFileName);
+                                _tcscat(pFilePart, _T("\\"));
+                                _tcscat(pFilePart, pSearchPart);
+
+                                dwFiles +=ProcessDirectory(szFullPath, dwFlags, dwAttrFlags);
+                                if (dwFiles & 0x80000000)
+                                {
+                                    break;
+                                }
+                        }
+                        while (FindNextFile (hFile, &f));
+	                FindClose (hFile);
+                }
+        }
+        return dwFiles;
+}        
+
+
+
 INT CommandDelete (LPTSTR cmd, LPTSTR param)
 {
 	/*cmd is the command that was given, in this case it will always be "del" or "delete"
 	param is whatever is given after the command*/
 
-	TCHAR szMsg[RC_STRING_MAX_SIZE];
-	TCHAR szFullPath[MAX_PATH];
-	LPTSTR pFilePart;
 	LPTSTR *arg = NULL;
-	TCHAR exfileName[MAX_PATH];
-	TCHAR * szFileName;
 	INT args;
 	INT i;
-	INT ii;
-	INT res;
 	INT   nEvalArgs = 0; /* nunber of evaluated arguments */
 	DWORD dwFlags = 0;
 	DWORD dwAttrFlags = 0;
 	DWORD dwFiles = 0;
-	HANDLE hFile;
-	HANDLE hFileExcl;
-	WIN32_FIND_DATA f;
-	WIN32_FIND_DATA f2;
 	LONG ch;
-	BOOL bSubFileFound = FALSE;
-	BOOL bExclusion;
 	TCHAR szOrginalArg[MAX_PATH];
-	TCHAR AltArg[MAX_PATH];
 
 	/*checks the first two chars of param to see if it is /?
 	this however allows the following command to not show help
 	"del frog.txt /?" */
 
+        if (!StringsLoaded)
+        {
+                LoadStrings();
+        }
+
 	if (!_tcsncmp (param, _T("/?"), 2))
 	{
 		ConOutResPaging(TRUE,STRING_DEL_HELP1);
@@ -382,263 +522,41 @@
 		dwFlags |= DEL_QUIET;
 
 	/* check for filenames anywhere in command line */
-	for (i = 0; i < args; i++)
+	for (i = 0; i < args && !(dwFiles & 0x80000000); i++)
 	{
 
                 /*this checks to see if it isnt a flag, if it isnt, we assume it is a file name*/
 		if((*arg[i] == _T('/')) || (*arg[i] == _T('-')))
 			continue;
-		bSubFileFound = FALSE;
 
-		/* We want to make 2 copies of the argument,
-		   1. copy will stay the same as the argument 
-			2. will be edited and striped down to the bad folder */
+		/* We want to make a copies of the argument */
 		if(_tcslen(arg[i]) == 2 && arg[i][1] == _T(':'))
 		{
 			/* Check for C: D: ... */
 			GetRootPath(arg[i],szOrginalArg,MAX_PATH);
-			GetRootPath(arg[i],AltArg,MAX_PATH);
 		}
 		else
 		{
 			_tcscpy(szOrginalArg,arg[i]);
-			_tcscpy(AltArg,arg[i]);
 		}
+                dwFiles += ProcessDirectory(szOrginalArg, &dwFlags, dwAttrFlags);
 
-		do
-		{
-			
-
-			if(dwFlags & DEL_SUBDIR)
-			{
-				
-				TCHAR FoundPath[MAX_PATH];				
-				TCHAR * PathFileName;
-				TCHAR PathBaseFolder[MAX_PATH];
-
-				/* Get just the file name */
-				PathFileName = _tcsrchr(szOrginalArg,_T('\\'));
-				if(PathFileName != NULL)
-					PathFileName++;
-				else
-					PathFileName = szOrginalArg;
-
-				/* Get the full path to the file */
-				GetFullPathName (szOrginalArg,MAX_PATH,PathBaseFolder,NULL);
-
-				/* strip the filename off of it */
-				for(ii = (_tcslen(PathBaseFolder) -  1); ii > -1; ii--)
-				{
-					if(PathBaseFolder[ii] != _T('\\'))
-						PathBaseFolder[ii] = _T('\0');
-					else
-					{
-						break;
-					}
-					
-				}
-			
-				/* Start looking for it, once it cant find anymore files on that name
-				   it returns false and that is how we know we have found all files in sub directories. */
-				if(_SearchPathex(PathBaseFolder,PathFileName,FoundPath,dwFlags))
-				{
-					bSubFileFound = TRUE;
-					_tcscpy(AltArg,FoundPath);
-				}
-				else
-				{
-					bSubFileFound = FALSE;
-					continue;
-				}
-				
-			}
-
-		
-		        if(_tcschr (AltArg, _T('*')) == NULL && 
-			        IsExistingDirectory (AltArg))
-		        {
-		                /* If it doesnt have a \ at the end already then on needs to be added */
-		                if(AltArg[_tcslen(AltArg) -  1] != _T('\\'))
-			                _tcscat (AltArg, _T("\\"));
-		                /* Add a wildcard after the \ */
-		                _tcscat (AltArg, _T("*"));
-		        }
-
-		        if(!_tcscmp (AltArg, _T("*")) ||
-			        !_tcscmp (AltArg, _T("*.*"))||
-			        (AltArg[_tcslen(AltArg) -  2] == _T('\\') && AltArg[_tcslen(AltArg) -  1] == _T('*')))
-		        {
-			        /*well, the user wants to delete everything but if they didnt yes DEL_YES, DEL_QUIET, or DEL_PROMPT
-			        then we are going to want to make sure that in fact they want to do that.  */
-
-			        if (!((dwFlags & DEL_YES) || (dwFlags & DEL_QUIET) || (dwFlags & DEL_PROMPT)))
-			        {
-				        LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szMsg, RC_STRING_MAX_SIZE);
-
-				        res = FilePromptYNA (szMsg);
-				        if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
-					        break;
-				        if(res == PROMPT_ALL)
-					        dwFlags |= DEL_YES;
-			        }
-		        }
-
-
-
-#ifdef _DEBUG
-		        ConErrPrintf (_T("File: %s\n"), arg[i]);
-#endif
-
-#ifdef _DEBUG
-		        ConErrPrintf(_T("Wildcards!\n\n"));
-#endif
-		
-		        GetFullPathName (AltArg,
-			                MAX_PATH,
-			                szFullPath,
-			                &pFilePart);
-
-#ifdef _DEBUG
-		        ConErrPrintf(_T("Full path: %s\n"), szFullPath);
-		        ConErrPrintf(_T("File part: %s\n"), pFilePart);
-#endif
-
-		        hFile = FindFirstFile (szFullPath, &f);
-		
-		        do
-		        {
-
-
-			        if (hFile == INVALID_HANDLE_VALUE)
-			        {
-				        error_file_not_found ();
-				        freep (arg);
-				        return 0;
-			        }
-
-			        /*bExclusion is the check varible to see if it has a match
-			        and it needs to be set to false before each loop, as it hasnt been matched yet*/						
-			        bExclusion = 0;
-			
-			        /*loop through each of the arguments*/
-			        for (ii = 0; ii < args; ii++)
-			        {
-				        /*check to see if it is a exclusion tag but not a ':' (used in ATTR)*/
-				        if(_tcschr (arg[ii], _T('-')) && _tcschr (arg[ii], _T(':')) == NULL)
-				        {
-					        /*remove the - from the front to get the real name*/
-					        _tcscpy (exfileName , arg[ii]);								
-					        szFileName = _tcstok (exfileName,_T("-"));								
-					        GetFullPathName (szFileName,
-						        MAX_PATH,
-						        szFullPath,
-						        &pFilePart);
-					        hFileExcl = FindFirstFile (szFullPath, &f2);								
-					        do
-					        {
-						        /*check to see if the filenames match*/
-						        if(!_tcscmp (f.cFileName, f2.cFileName))
-							        bExclusion = 1;	
-					        }
-					        while (FindNextFile (hFileExcl, &f2));
-				        }
-			        }
-			
-			        /*if it is going to be excluded by - no need to check attrs*/
-			        if(dwFlags & DEL_ATTRIBUTES && bExclusion == 0)
-			        {
-
-				        /*save if file attr check if user doesnt care about that attr anyways*/
-				        if(dwAttrFlags & ATTR_ARCHIVE && !(f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE))
-					        bExclusion = 1;
-				        if(dwAttrFlags & ATTR_HIDDEN && !(f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
-					        bExclusion = 1;
-				        if(dwAttrFlags & ATTR_SYSTEM && !(f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
-					        bExclusion = 1;
-				        if(dwAttrFlags & ATTR_READ_ONLY && !(f.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
-					        bExclusion = 1;
-				        if(dwAttrFlags & ATTR_N_ARCHIVE && (f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE))
-					        bExclusion = 1;
-				        if(dwAttrFlags & ATTR_N_HIDDEN && (f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
-					        bExclusion = 1;
-				        if(dwAttrFlags & ATTR_N_SYSTEM && (f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
-					        bExclusion = 1;
-				        if(dwAttrFlags & ATTR_N_READ_ONLY && (f.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
-					        bExclusion = 1;
-			        }
-
-			        if(bExclusion)
-				        continue;
-
-			        /* ignore ".", ".." and directories */
-			        if (!_tcscmp (f.cFileName, _T(".")) ||
-				        !_tcscmp (f.cFileName, _T("..")) ||
-				        f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-				        continue;
-
-			        _tcscpy (pFilePart, f.cFileName);
-
-#ifdef _DEBUG
-			        ConErrPrintf(_T("Full filename: %s\n"), szFullPath);
-#endif
-
-			        /* ask for deleting */
-			        if (dwFlags & DEL_PROMPT)
-			        {
-				        LoadString(CMD_ModuleHandle, STRING_DEL_ERROR5, szMsg, RC_STRING_MAX_SIZE);
-				        ConErrPrintf(szMsg, szFullPath);
-
-				        LoadString(CMD_ModuleHandle, STRING_DEL_ERROR6, szMsg, RC_STRING_MAX_SIZE);
-				        res = FilePromptYN (szMsg);
-
-				        if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
-				        {
-					        continue;  //FIXME: Errorcode?
-				        }
-			        }
-
-			        /*user cant ask it to be quiet and tell you what it did*/
-			        if (!(dwFlags & DEL_QUIET) && !(dwFlags & DEL_TOTAL))
-			        {
-				        LoadString(CMD_ModuleHandle, STRING_DEL_ERROR7, szMsg, RC_STRING_MAX_SIZE);
-				        ConErrPrintf(szMsg, szFullPath);
-			        }
-
-			        /* delete the file */
-			        if(dwFlags & DEL_NOTHING)
-				        continue;
-
-
-			        if(RemoveFile (szFullPath, dwFlags))
-				        dwFiles++;
-			        else
-			        {
-				        bSubFileFound = FALSE;
-				        ErrorMessage (GetLastError(), _T(""));
-				        break;
-			        }
-		        }
-		        while (FindNextFile (hFile, &f));
-	                FindClose (hFile);
-		}
-		while(bSubFileFound);
-	}
+        }
 	
 	freep (arg);
 
 	/*Based on MS cmd, we only tell what files are being deleted when /S is used */
 	if (dwFlags & DEL_TOTAL)
 	{
+                dwFiles &= 0x7fffffff;
 		if (dwFiles < 2)
 		{
-			LoadString(CMD_ModuleHandle, STRING_DEL_HELP3, szMsg, RC_STRING_MAX_SIZE);
+                        ConOutPrintf(szDelHelp3, dwFiles);
 		}
 		else
 		{
-			LoadString(CMD_ModuleHandle, STRING_DEL_HELP4, szMsg, RC_STRING_MAX_SIZE);
+			ConOutPrintf(szDelHelp4, dwFiles);
 		}
-
-		ConOutPrintf(szMsg, dwFiles);
 	}
 
 	return 0;