148 lines
2.7 KiB
C
148 lines
2.7 KiB
C
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
/*++
|
||
|
|
||
|
Copyright (c) 1991 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
delnode.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Delnode routine for Setup.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Ted Miller (tedm) August 1992
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
//
|
||
|
// Bug whereby \$win_nt$.~ls\os2 directory is not deleted
|
||
|
//
|
||
|
//#define BUG_1818
|
||
|
#ifdef BUG_1818
|
||
|
char auxbuf[256];
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//
|
||
|
// Put these out here so we don't consume huge stack space as we recurse.
|
||
|
//
|
||
|
|
||
|
TCHAR Pattern[MAX_PATH];
|
||
|
WIN32_FIND_DATA FindData;
|
||
|
|
||
|
VOID
|
||
|
DelnodeRoutine(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
LPTSTR PatternEnd;
|
||
|
HANDLE FindHandle;
|
||
|
|
||
|
//
|
||
|
// Delete each file in the directory, then remove the directory itself.
|
||
|
// If any directories are encountered along the way recurse to delete
|
||
|
// them as they are encountered.
|
||
|
//
|
||
|
|
||
|
PatternEnd = Pattern+lstrlen(Pattern);
|
||
|
|
||
|
lstrcat(Pattern,TEXT("\\*"));
|
||
|
FindHandle = FindFirstFile(Pattern,&FindData);
|
||
|
|
||
|
if(FindHandle != INVALID_HANDLE_VALUE) {
|
||
|
|
||
|
do {
|
||
|
|
||
|
//
|
||
|
// Form the full name of the file we just found.
|
||
|
//
|
||
|
|
||
|
lstrcpy(PatternEnd+1,FindData.cFileName);
|
||
|
|
||
|
//
|
||
|
// Remove read-only atttribute if it's there.
|
||
|
//
|
||
|
|
||
|
if(FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) {
|
||
|
SetFileAttributes(Pattern,FILE_ATTRIBUTE_NORMAL);
|
||
|
}
|
||
|
|
||
|
if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||
|
|
||
|
//
|
||
|
// The current match is a directory. Recurse into it unless
|
||
|
// it's . or ...
|
||
|
//
|
||
|
|
||
|
if(lstrcmp(FindData.cFileName,TEXT("." ))
|
||
|
&& lstrcmp(FindData.cFileName,TEXT("..")))
|
||
|
{
|
||
|
DelnodeRoutine();
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
|
||
|
//
|
||
|
// The current match is not a directory -- so delete it.
|
||
|
//
|
||
|
|
||
|
DeleteFile(Pattern);
|
||
|
}
|
||
|
|
||
|
*(PatternEnd+1) = 0;
|
||
|
|
||
|
} while(FindNextFile(FindHandle,&FindData));
|
||
|
|
||
|
FindClose(FindHandle);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Remove the directory we just emptied out.
|
||
|
//
|
||
|
|
||
|
*PatternEnd = 0;
|
||
|
#ifdef BUG_1818
|
||
|
if(!RemoveDirectory(Pattern)) {
|
||
|
|
||
|
ULONG err = GetLastError();
|
||
|
|
||
|
MessageBox(
|
||
|
NULL,
|
||
|
"Leave the machine exactly as it is now and get tedm (x63482).",
|
||
|
"Trying to catch bug 1818",
|
||
|
MB_TASKMODAL | MB_OK | MB_ICONSTOP
|
||
|
);
|
||
|
|
||
|
wsprintf(auxbuf,"Dir: %s\nErr: %lu",Pattern,err);
|
||
|
MessageBox(
|
||
|
NULL,
|
||
|
auxbuf,
|
||
|
"",
|
||
|
MB_TASKMODAL | MB_OK
|
||
|
);
|
||
|
|
||
|
DbgBreakPoint();
|
||
|
}
|
||
|
#endif
|
||
|
RemoveDirectory(Pattern);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
VOID
|
||
|
DoDelnode(
|
||
|
IN PCHAR Directory
|
||
|
)
|
||
|
{
|
||
|
lstrcpy(Pattern,Directory);
|
||
|
|
||
|
DelnodeRoutine();
|
||
|
}
|