📄 diskobject.cpp
字号:
res = FindNextFile( findhandle, &ff );
}
FindClose( findhandle );
}
else
{
// Set error message
SetSystemErrorMessage( ::GetLastError( ), sourceFiles );
result = FALSE;
}
return result;
}
BOOL CDiskObject::EnumAllDirectories( const CString& sourceDirectory, CStringArray& directories )
/* ============================================================
Function : CDiskObject::EnumAllDirectories
Description : Enumerates all directories recursively in
directory "sourceDirectory", and adds them
to the "CStringArray" "directories". Each entry
will be a fully qualified name
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will contain errors
Parameters : CString sourceDirectory - start directory
CStringArray& directories - "CStringArray" to be
filled with the
directory names.
Usage : Call to get the directory names in a
directory tree.
============================================================*/
{
ClearError( );
CString source( sourceDirectory );
QualifyPath( source );
CString sourceFiles( source + _T( "*.*" ) );
BOOL result = TRUE;
WIN32_FIND_DATA ff;
HANDLE findhandle = FindFirstFile( sourceFiles, &ff );
if( findhandle != INVALID_HANDLE_VALUE)
{
BOOL res = TRUE;
while( res)
{
// We only want directories
if( ( ff.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) && _tcscmp( ff.cFileName, _T( "." ) ) && _tcscmp( ff.cFileName, _T( ".." ) ) )
{
CString directory( source + ff.cFileName );
directories.Add( directory + _TCHAR( '\\' ) );
Trigger( ff.cFileName );
if( !( result = EnumAllDirectories( directory, directories ) ) )
res = FALSE;
}
if( res )
res = FindNextFile( findhandle, &ff );
else
result = FALSE;
}
FindClose( findhandle );
}
else
{
// Set error message
SetSystemErrorMessage( ::GetLastError( ), sourceFiles );
result = FALSE;
}
return result;
}
BOOL CDiskObject::EnumDirectories( const CString& sourceDirectory, CStringArray& directories )
/* ============================================================
Function : CDiskObject::EnumDirectories
Description : Enumerates all directories in directory
"sourceDirectory", and adds them to the
"CStringArray" "directories". Each entry will
be a fully qualified name
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will contain errors
Parameters : CString sourceDirectory - start directory
CStringArray& directories - "CStringArray" to be
filled with the
directory names.
Usage : Call to get a list of directories in a
directory tree.
============================================================*/
{
ClearError( );
CString source( sourceDirectory );
QualifyPath( source );
CString sourceFiles( source + _T( "*.*" ) );
BOOL result = TRUE;
WIN32_FIND_DATA ff;
HANDLE findhandle = FindFirstFile( sourceFiles, &ff );
if( findhandle != INVALID_HANDLE_VALUE)
{
BOOL res = TRUE;
while( res)
{
// We only want directories
if( ( ff.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) && _tcscmp( ff.cFileName, _T( "." ) ) && _tcscmp( ff.cFileName, _T( ".." ) ) )
{
directories.Add( ff.cFileName );
Trigger( ff.cFileName );
}
if( res )
res = FindNextFile( findhandle, &ff );
else
result = FALSE;
}
FindClose( findhandle );
}
else
{
// Set error message
SetSystemErrorMessage( ::GetLastError( ), sourceFiles );
result = FALSE;
}
return result;
}
BOOL CDiskObject::EnumAllFiles( const CString& sourceDirectory, CStringArray& files )
/* ============================================================
Function : CDiskObject::EnumAllFiles
Description : Returns, recursively, the fully qualified
names of all files found under
"sourceDirectory".
Access : Public
Return : BOOL - "TRUE" if OK.
Parameters : CString sourceDirectory - Root dir
CStringArray& files - output list
of all files
found
Usage : Call to get the names of all files in a
directory tree.
============================================================*/
{
return EnumAllFilesWithFilter( _T( "*.*" ), sourceDirectory, files );
}
BOOL CDiskObject::EnumAllFilesWithFilter( const CString& filter,const CString& sourceDirectory, CStringArray& files )
/* ============================================================
Function : CDiskObject::EnumAllFiles
Description : Returns, recursively, the fully qualified
names of all files matching the filter
found under "sourceDirectory".
Access : Public
Return : BOOL - "TRUE" if OK.
Parameters : CString filter - Filter for files
to find
CString sourceDirectory - Root dir
CStringArray& files - output list
of all files
found
Usage : Call to get a filtered list of all files in
a directory tree.
============================================================*/
{
CStringArray dirs;
BOOL result = EnumAllDirectories( sourceDirectory, dirs );
if( result )
{
int max1 = dirs.GetSize( );
for( int t = 0 ; t < max1 ; t++ )
{
CString dir = dirs[ t ];
QualifyPath( dir );
CStringArray dirfiles;
if( EnumFilesInDirectoryWithFilter( filter, dir, dirfiles, EF_FULLY_QUALIFIED ) )
{
int max2 = dirfiles.GetSize( );
for( int i = 0 ; i < max2 ; i++ )
{
CString file = dirfiles[ i ];
Trigger( file );
files.Add( file );
}
}
}
}
return result;
}
////////////////////////////////////////
// Error handling
CString CDiskObject::GetErrorMessage( )
/* ============================================================
Function : CDiskObject::GetErrorMessage
Description : Will return the current error message for
the "CDiskObject".
Access : Public
Return : CString - current error message.
Parameters : none
Usage : Call to get the error message.
============================================================*/
{
return m_errorMessage;
}
// Private methods
void CDiskObject::ClearError( )
/* ============================================================
Function : CDiskObject::ClearError
Description : Clears the internal error message string
Access : Private
Return : void
Parameters : none
Usage : Call to clear the internal error message.
============================================================*/
{
m_errorMessage = _T( "" );
}
void CDiskObject::SetSystemErrorMessage( int error,const CString& elements)
/* ============================================================
Function : CDiskObject::SetSystemErrorMessage
Description : Sets the error message string with the
system error message as gotten from
"GetLastError". "elements" will be appended.
Access : Private
Return : void
Parameters : int error - error number from
"GetLastError"
CString elements - files or directories
to add to the message
Usage : Call to set the error message.
============================================================*/
{
LPVOID msgBuff;
// Format error message from system
::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
error,
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
( LPTSTR ) &msgBuff,
0,
NULL
);
// Create the error string
m_errorMessage = CString( ( LPTSTR ) msgBuff );
m_errorMessage.TrimLeft( );
m_errorMessage.TrimRight( );
if( elements.GetLength( ) )
m_errorMessage += _TCHAR( ' ' ) + elements;
Trigger ( m_errorMessage );
// Free the buffer.
LocalFree( msgBuff );
}
void CDiskObject::SetInternalErrorMessage( )
/* ============================================================
Function : CDiskObject::SetInternalErrorMessage
Description : Sets the error message to the internal error
message
Access : Private
Return : void
Parameters : none
Usage : Call to set the error message.
============================================================*/
{
m_errorMessage = _T( "CDiskObject internal error" );
Trigger ( m_errorMessage );
}
////////////////////////////////////////
// Helpers
void CDiskObject::QualifyPath( CString& str )
/* ============================================================
Function : CDiskObject::QualifyPath
Description : Creates a fully qualified path from "str".
Access : Private
Return : void
Parameters : CString& str - the path to qualify
Usage : Call to create a fully qualified path.
============================================================*/
{
str.Replace( _TCHAR( '/' ), _TCHAR( '\\' ) );
// Append a trailing backslash to directory name
if( str.GetLength( ) )
if( str[ str.GetLength( ) - 1 ] != _TCHAR( '\\' ) )
str += _TCHAR( '\\' );
if( str.GetLength( ) < 2 || str.Left( 2) != "\\\\" )
QualifyFile( str );
}
void CDiskObject::QualifyFile( CString& str )
/* ============================================================
Function : CDiskObject::QualifyFile
Description : Creates a fully qualified path from "str".
Access : Private
Return : void
Parameters : CString& str - the filename to qualify
Usage : Call to create a fully qualified filename.
============================================================*/
{
str.Replace( _TCHAR( '/' ), _TCHAR( '\\' ) );
_TCHAR drive[ _MAX_DRIVE ];
_TCHAR dir[ _MAX_DIR ];
_TCHAR fname[ _MAX_FNAME ];
_TCHAR ext[ _MAX_EXT ];
_tsplitpath( str, drive, dir, fname, ext );
if( !_tcsclen( drive ) )
{
CString test( dir );
// The name is not fully qualified.
// We assume it to be relative the
// current directory
TCHAR currentDirectory[ _MAX_PATH ];
::GetCurrentDirectory( _MAX_PATH, currentDirectory );
if( test.GetLength( ) > 2 && test.Left( 3 ) == _T( "..\\" ) )
{
TCHAR upDirectory[ _MAX_PATH ];
while( test.GetLength( ) > 2 && test.Left( 3 ) == _T( "..\\" ) )
{
::SetCurrentDirectory( _T( ".." ) );
test = test.Right( test.GetLength( ) - 3 );
}
::GetCurrentDirectory( _MAX_PATH, upDirectory );
str = upDirectory;
str += _TCHAR( '\\' );
str += fname;
str += ext;
::SetCurrentDirectory( currentDirectory );
}
else if ( test.GetLength( ) && test[ 0 ] == _TCHAR( '\\' ) )
{
// Start from root
_tsplitpath( currentDirectory, drive, dir, fname, ext );
str = drive + str;
}
else
{
str = _TCHAR( '\\' ) + str;
str = currentDirectory + str;
}
}
}
CString CDiskObject::GetFileName( const CString& str )
/* ============================================================
Function : CDiskObject::GetFileName
Description : Returns the file name part of "str".
Access : Private
Return : CString -
Parameters : CString str - The complete name to get
Usage : Call to get the filename from a fully
qualified path.
============================================================*/
{
CString instr( str );
QualifyFile( instr );
CString file;
int found = instr.ReverseFind( _TCHAR( '\\' ) );
if( found != -1 )
file = instr.Right( str.GetLength( ) - ( found + 1 ) );
return file;
}
CString CDiskObject::GetDirectoryName( const CString& str )
/* ============================================================
Function : CDiskObject::GetDirectoryName
Description : Returns the directory name part of "str"
Access : Private
Return : CString -
Parameters : CString str - The complete name to check
Usage : Call to get the directory from a fully
qualified path.
============================================================*/
{
CString instr( str );
QualifyFile( instr );
CString directory;
int found = instr.ReverseFind( _TCHAR( '\\' ) );
if( found != -1 )
directory = instr.Left( found );
return directory;
}
#pragma warning( default : 4706 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -