📄 diskobject.cpp
字号:
/* ============================================================
Function : CDiskObject::EmptyDirectory
Description : Will delete all files in directory.
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage" will
get an error
string if "FALSE"
Parameters : CString directory - the directory to
empty.
Usage : Call to empty a directory.
============================================================*/
{
ClearError( );
CString indir( directory );
QualifyPath( indir );
// Enumerate all files
CStringArray files;
BOOL result = EnumFilesInDirectory( indir, files );
if( result )
{
int max = files.GetSize( );
for( int t = 0 ; t < max ; t++ )
{
// Loop and delete
CString file = files[ t ];
Trigger( file );
if( !( result = ::DeleteFile( indir + file ) ) )
{
SetSystemErrorMessage( ::GetLastError( ), indir + file );
t = max;
}
}
}
return result;
}
BOOL CDiskObject::RemoveDirectory( const CString& directory )
/* ============================================================
Function : CDiskObject::RemoveDirectory
Description : Will remove the directory "directory", even
if not empty. Will not remove
subdirectories.
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will get an error
string if "FALSE"
Parameters : CString directory - directory to
remove.
Usage : Call to remove a directory.
============================================================*/
{
ClearError( );
BOOL result = TRUE;
CString indir( directory );
if( indir.GetLength( ) )
{
QualifyPath( indir );
// Wipe and remove directory
if( ( result = EmptyDirectory( indir ) ) )
{
Trigger( indir );
if( !( result = ::RemoveDirectory( indir ) ) )
SetSystemErrorMessage( ::GetLastError( ), indir );
}
}
else
{
// Small sanity check, we can't
// delete the current directory.
SetInternalErrorMessage( );
result = FALSE;
}
return result;
}
BOOL CDiskObject::RemoveDirectories( const CString& directory )
/* ============================================================
Function : CDiskObject::RemoveDirectories
Description : Will remove the directory "directory", even
if not empty. Will remove subdirectories.
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will get an error
string if "FALSE"
Parameters : CString directory - root directory to
remove.
Usage : Call to remove a directory tree.
============================================================*/
{
ClearError( );
BOOL result = TRUE;
CString indir( directory );
if( indir.GetLength( ) )
{
QualifyPath( indir );
CStringArray directories;
// Get all directories
;
if( ( result = EnumAllDirectories( indir, directories ) ) )
{
// Loop and remove
int max = directories.GetSize( );
for( int t = max - 1; t >= 0 ; t-- )
if( !( result = RemoveDirectory( directories[ t ] ) ) )
t = -1;
if( result )
result = RemoveDirectory( indir );
}
}
else
{
// Small sanity check, we can't
// delete the current directory.
SetInternalErrorMessage( );
result = FALSE;
}
return result;
}
BOOL CDiskObject::EmptyDirectories( const CString& directory )
/* ============================================================
Function : CDiskObject::EmptyDirectories
Description : Will delete all files in "directory". Will
also empty subdirectories.
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will get an error
string if "FALSE"
Parameters : CString directory - the root directory
to empty.
Usage : Call to empty a directory tree.
============================================================*/
{
ClearError( );
CString indir( directory );
QualifyPath( indir );
CStringArray directories;
// Get all directories
BOOL result = EnumAllDirectories( indir, directories );
if( result )
{
int max = directories.GetSize( );
// Loop and empty
for( int t = max - 1 ; t >= 0 ; t-- )
if( !( result = EmptyDirectory( directories[ t ] ) ) )
t = -1;
if( result )
result = EmptyDirectory( indir );
}
return result;
}
BOOL CDiskObject::CopyDirectory( const CString& sourceDirectory,const CString& destDirectory )
/* ============================================================
Function : CDiskObject::CopyDirectory
Description : Copies all the files from "sourceDirectory"
to "destDirectory". Existing files will be
overwritten. "destDirectory" will be created
if necessary. Subdirectories will not be
copied.
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will get an error
string if "FALSE"
Parameters : CString sourceDirectory - copy from.
CString destDirectory - copy to.
Usage : Call to copy a directory to another
directory.
============================================================*/
{
ClearError( );
CString source( sourceDirectory );
CString dest( destDirectory );
QualifyPath( source );
QualifyPath( dest );
Trigger( dest );
// We don't care if this fails - CopyFiles will
// return an error in that case.
::CreateDirectory( dest, NULL );
return CopyFiles( source, dest );
}
BOOL CDiskObject::CopyDirectories( const CString& sourceDirectory,const CString& destDirectory )
/* ============================================================
Function : CDiskObject::CopyDirectories
Description : Copies all the files and subdirectories
from "sourceDirectory" to "destDirectory",
keeping the directory structure. Existing
files will be overwritten. "destDirectory"
and subdirectories will be created if
necessary.
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will get an
error string
if "FALSE"
Parameters : CString sourceDirectory - copy from.
CString destDirectory - copy to.
Usage : Call to copy a directory tree to a new
directory tree.
============================================================*/
{
ClearError( );
CString source( sourceDirectory );
CString dest( destDirectory );
QualifyPath( source );
QualifyPath( dest );
// Enumerate all directories and files below sourceDirectory
CStringArray directories;
directories.Add( source );
BOOL result = EnumAllDirectories( source, directories );
if( result )
{
// Create and copy directories
int max = directories.GetSize( );
for( int t = 0 ; t < max ; t++ )
{
// Create names and copy
CString from = directories[ t ];
CString part = from.Right( from.GetLength( ) - source.GetLength( ) );
CString to = dest + part;
if( !( result = CopyFiles( from, to ) ) )
t = max;
}
}
return result;
}
////////////////////////////////////////
// File-oriented operations
//
BOOL CDiskObject::FileExists( const CString& file )
/* ============================================================
Function : CDiskObject::FileExists
Description : Returns "TRUE" if the file file exists
Access : Public
Return : BOOL - "TRUE" if found
Parameters : CString file - file to check
Usage : Call to check for file existence.
============================================================*/
{
ClearError( );
BOOL result = TRUE;
if( file.GetLength( ) )
{
CString infile( file );
QualifyFile( infile );
HANDLE filehandle = ::CreateFile(
infile,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( filehandle == INVALID_HANDLE_VALUE )
result = FALSE;
else
CloseHandle( filehandle );
}
else
{
SetInternalErrorMessage( );
result = FALSE;
}
return result;
}
BOOL CDiskObject::CreateFile( const CString& file )
/* ============================================================
Function : CDiskObject::CreateFile
Description : Creates the file "file", as well as the
directories necessary
Access : Public
Return : BOOL - "TRUE" if OK
Parameters : CString file - file to create
Usage : Call to create a file.
============================================================*/
{
ClearError( );
BOOL result = TRUE;
if( file.GetLength( ) )
{
CString infile( file );
QualifyFile( infile );
// Split into directory and file
CString directory = GetDirectoryName( infile );
CString filename = GetFileName( infile );
if( ( result = CreateDirectory( directory ) ) )
{
Trigger( file );
HANDLE filehandle = ::CreateFile(
infile,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( filehandle == INVALID_HANDLE_VALUE )
result = FALSE;
else
CloseHandle( filehandle );
}
}
else
{
SetInternalErrorMessage( );
result = FALSE;
}
return result;
}
////////////////////////////////////////
// Helpers
//
BOOL CDiskObject::EnumFilesInDirectory( const CString& sourceDirectory, CStringArray& files, int mode )
/* ============================================================
Function : CDiskObject::EnumFilesInDirectory
Description : Enumerates all files in directory
"sourceDirectory", and adds them to the
"CStringArray" "files". Will not add
subdirectories
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will contain errors
Parameters : CString sourceDirectory - The directory to
enumerate
CStringArray& files - The resulting files
Usage : Call to get a list of files in a directory.
============================================================*/
{
return EnumFilesInDirectoryWithFilter( _T( "*.*" ), sourceDirectory, files, mode );
}
BOOL CDiskObject::EnumFilesInDirectoryWithFilter( const CString& strFilter,const CString& sourceDirectory, CStringArray& files, int mode )
/* ============================================================
Function : CDiskObject::EnumFilesInDirectoryWithFilter
Description : Enumerates all files matching "strFilter" in
the directory "sourceDirectory", and adds
them to the "CStringArray" "files". Will not
add subdirectories.
Access : Public
Return : BOOL - "TRUE" if OK.
"GetErrorMessage"
will contain errors
Parameters : CString strFilter - the file name filter
CString sourceDirectory - source directory
CStringArray& files - output array
Usage : Call to get a filtered list of files from
a directory.
============================================================*/
{
ClearError( );
CString source( sourceDirectory );
QualifyPath( source );
CString sourceFiles( source + strFilter );
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 files
if( !( ff.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
{
CString file;
file = ff.cFileName;
if( mode == EF_FULLY_QUALIFIED )
file = sourceDirectory + file;
files.Add( file );
Trigger( file );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -