在文件系统中,经常会复制某个目录下的所有文件和子目录及其包含的文件到另外一个目录中,在DOS操作系统中,实现这个功能的命令名叫Xcopy,下面就使用树的递归遍历算法来实现这个Xcopy功能。
下面以流行的Windows操作系统来实现这个功能,实现编码如下。
#include <windows.h> /** 将一个目录及子目录下的所有文件复制到另外一个目录下
@param char *pszSrcDir - 要拷贝的源目录
@param char *pszTargeDir - 目标目录
@param BOOL bOverWrite - 覆盖标志,FALSE表示覆盖
@return void - 无
*/
void Xcopy( char *pszSrcDir, char *pszTargeDir, BOOL bOverWrite )
{
char lBaseSearch[MAX_PATH];
HANDLE lhFile;
WIN32_FIND_DATA lfData;
sprintf( lBaseSearch, "%s*.*", pszSrcDir );
lhFile = FindFirstFile( lBaseSearch, &lfData );
if ( lhFile == INVALID_HANDLE_VALUE ) {
return;
}
do {
CreateDirectory( pszTargeDir, NULL );
if ( !strcmp( lfData.cFileName, "." ) ||
!strcmp( lfData.cFileName, ".." )) {
/* 跳过 . and .. 不处理 */
continue;
}
if ( lfData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
/* 目录 */
char szBaseDir[MAX_PATH];
char szTargeDir[MAX_PATH];
sprintf( szBaseDir, "%s\%s", pszSrcDir, lfData.cFileName );
sprintf( szTargeDir, "%s\%s", pszTargeDir, lfData.cFileName );
Xcopy( szBaseDir, szTargeDir, bOverWrite );
}
else {
/* 普通文件 */
char szBaseDir[MAX_PATH];
char szTargeDir[MAX_PATH];
sprintf( szBaseDir, "%s\%s", pszSrcDir, lfData.cFileName );
sprintf( szTargeDir, "%s\%s", pszTargeDir, lfData.cFileName );
CopyFile( szBaseDir, szTargeDir, bOverWrite );
}
} while ( FindNextFile( lhFile, &lfData ));
FindClose( lhFile );
}
责任编辑:小草