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.
 
 
 
 
 
 

139 lines
3.5 KiB

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2002 Microsoft Corporation
//
// Module Name:
// DirectoryUtils.cpp
//
// Description:
// Useful functions for manipulating directies.
//
// Maintained By:
// Galen Barbee (GalenB) 05-DEC-2000
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <objbase.h>
#include <shlwapi.h>
#include <ComCat.h>
#include <wchar.h>
#include <Dsgetdc.h>
#include <Lm.h>
#if !defined( THR )
#define THR( _hr ) _hr
#endif
#if !defined( TW32 )
#define TW32( _sc ) _sc
#endif
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// HrCreateDirectoryPath(
// LPWSTR pszDirectoryPathInOut
// )
//
// Descriptions:
// Creates the directory tree as required.
//
// Arguments:
// pszDirectoryPathOut
// Must be MAX_PATH big. It will contain the trace log file path to
// create.
//
// Return Values:
// S_OK - Success
// other HRESULTs for failures
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
HrCreateDirectoryPath( LPWSTR pszDirectoryPath )
{
LPTSTR psz;
BOOL fReturn;
DWORD dwAttr;
HRESULT hr = S_OK;
//
// Find the \ that indicates the root directory. There should be at least
// one \, but if there isn't, we just fall through.
//
// skip X:\ part
psz = wcschr( pszDirectoryPath, L'\\' );
// Assert( psz != NULL );
if ( psz != NULL )
{
//
// Find the \ that indicates the end of the first level directory. It's
// probable that there won't be another \, in which case we just fall
// through to creating the entire path.
//
psz = wcschr( psz + 1, L'\\' );
while ( psz != NULL )
{
// Terminate the directory path at the current level.
*psz = 0;
//
// Create a directory at the current level.
//
dwAttr = GetFileAttributes( pszDirectoryPath );
if ( 0xFFFFffff == dwAttr )
{
// DebugMsg( TEXT("DEBUG: Creating %ws"), pszDirectoryPath );
fReturn = CreateDirectory( pszDirectoryPath, NULL );
if ( ! fReturn )
{
hr = HRESULT_FROM_WIN32( TW32( GetLastError() ) );
goto Error;
} // if: creation failed
} // if: directory not found
else if ( ( dwAttr & FILE_ATTRIBUTE_DIRECTORY ) == 0 )
{
hr = THR( HRESULT_FROM_WIN32( ERROR_DIRECTORY ) );
goto Error;
} // else: file found
//
// Restore the \ and find the next one.
//
*psz = L'\\';
psz = wcschr( psz + 1, L'\\' );
} // while: found slash
} // if: found slash
//
// Create the target directory.
//
dwAttr = GetFileAttributes( pszDirectoryPath );
if ( 0xFFFFffff == dwAttr )
{
fReturn = CreateDirectory( pszDirectoryPath, NULL );
if ( ! fReturn )
{
hr = THR( HRESULT_FROM_WIN32( GetLastError( ) ) );
} // if: creation failed
} // if: path not found
Error:
return hr;
} //*** HrCreateDirectoryPath()