Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//-----------------------------------------------------------------------------
// Util.cpp
//-----------------------------------------------------------------------------
#include "util.h"
#include "assert.h"
#define ASSERT assert
//-----------------------------------------------------------------------------
// Takes a const TCHAR * adds a BS if necessary and converts
// it to a TSTRING
//
// 1/11/2000 paolora added to new util.cpp
//-----------------------------------------------------------------------------
TSTRING StrAddBS( const TCHAR *szDirIn ) { ASSERT( szDirIn ); if (!szDirIn || !_tcslen( szDirIn )) return _T("");
TSTRING str = szDirIn;
// Do another MBCS ANSI safe comparison
const TCHAR *szTemp = szDirIn; const UINT iSize = _tcsclen( szDirIn ) - 1; for( UINT ui = 0; ui < iSize; ui++ ) szTemp = CharNext( szTemp );
if (_tcsncmp( szTemp, _T("\\"), 1)) str += _T("\\");
return str; }
//-----------------------------------------------------------------------------
// Takes a const TSTRING and adds a BS if necessary
//
// 1/13/2000 paolora added to new util.cpp
//-----------------------------------------------------------------------------
void AddBS( TSTRING *strDir ) { ASSERT( strDir ); if (!strDir || !strDir->length()) return;
*strDir = StrAddBS( strDir->c_str() ); return; }
//-----------------------------------------------------------------------------
// Takes a const TCHAR * and deletes all the dirs and files below and
// including the input directory
//
// 12/11/2000 paolora added to new util.cpp
//-----------------------------------------------------------------------------
BOOL BDeleteDirTree( const TCHAR *szDir, BOOL bDeleteInputDir /*=TRUE*/ ) { ASSERT( szDir ); if (!szDir || !_tcslen( szDir )) return FALSE;
// Create the findfirstfile path
TSTRING strDir = szDir; AddBS( &strDir ); strDir += (TSTRING)_T("*"); // Find the first file
BOOL bFileFound; TSTRING strItem = szDir; WIN32_FIND_DATA ffd; HANDLE hItem = FindFirstFile( strDir.c_str(), &ffd ); if(hItem && (INVALID_HANDLE_VALUE != hItem)) bFileFound = TRUE; // While files and dirs exist
while( bFileFound ) { if (_tcscmp( ffd.cFileName, _T(".")) && _tcscmp( ffd.cFileName, _T("..") )) { // Create item name
strItem = szDir; AddBS( &strItem ); strItem += (TSTRING)ffd.cFileName; // If a Dir, recurse
if (FILE_ATTRIBUTE_DIRECTORY & ffd.dwFileAttributes) { if (!BDeleteDirTree( strItem.c_str(), TRUE )) { FindClose( hItem ); return FALSE; } } // Then a file, delete it
else if (!DeleteFile( strItem.c_str() )) { FindClose( hItem ); return FALSE; } } bFileFound = FindNextFile( hItem, &ffd ); }
// Close the find handle
if(hItem && (INVALID_HANDLE_VALUE != hItem)) FindClose( hItem );
// Remove the present directory
if (bDeleteInputDir) { if (!RemoveDirectory( szDir )) return FALSE; } return TRUE; }
|