读取文件图标及目录Copy[2006-10-16]

1. 使用SHGetFileInfo 函数提取文件ICON:

// ---------------------------------------------------------------------------------------------------------------
//    头文件  ICONExtracter.h
// ---------------------------------------------------------------------------------------------------------------
class  CIconExtracter
{
public:
    CIconExtracter(
void);
    
~CIconExtracter(void);
public:
    HIMAGELIST    GetDirIconsList( 
const TCHAR* DirPath, bool bSmallIcon );
    UINT        GetDirIndex( 
bool bSmallIcon );
    UINT        GetFileIndex( 
const TCHAR* FilePath, bool bSmallIcon );
    HICON        GetDirIcon( 
bool bSmallIcon );
    HICON        GetFileIcon( 
const TCHAR* FilePath, bool bSmallIcon );
}
;

// ---------------------------------------------------------------------------------------------------------------
//    实现文件 iconextracter.cpp
// ---------------------------------------------------------------------------------------------------------------

#include 
" .iconextracter.h "

CIconExtracter::CIconExtracter(
void )
{
}


CIconExtracter::
~ CIconExtracter( void )
{

}


HIMAGELIST    CIconExtracter::GetDirIconsList( 
const  TCHAR *  DirPath,  bool  bSmallIcon )
{
    SHFILEINFO sfi;
    DWORD dwFlag 
= SHGFI_SYSICONINDEX;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    
return (HIMAGELIST)SHGetFileInfo( DirPath, 0&sfi, sizeof( SHFILEINFO ), dwFlag );
}


UINT CIconExtracter::GetDirIndex( 
bool  bSmallIcon )
{
    SHFILEINFO sfi;
    DWORD dwFlag 
= SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    SHGetFileInfo( _T(
"other"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof( SHFILEINFO ), dwFlag );
    
return sfi.iIcon;
}


UINT CIconExtracter::GetFileIndex( 
const  TCHAR *  FilePath,  bool  bSmallIcon )
{
    SHFILEINFO sfi;
    DWORD dwFlag 
= SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    SHGetFileInfo( FilePath, FILE_ATTRIBUTE_NORMAL, 
&sfi, sizeof( SHFILEINFO ), dwFlag );
    
return sfi.iIcon;
}


HICON    CIconExtracter::GetDirIcon( 
bool  bSmallIcon )
{
    SHFILEINFO sfi;
    DWORD dwFlag 
= SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    SHGetFileInfo( _T(
"no mattor"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof( SHFILEINFO ), dwFlag );
    
return sfi.hIcon;
}


HICON    CIconExtracter::GetFileIcon( 
const  TCHAR *  FilePath,  bool  bSmallIcon )
{
    SHFILEINFO sfi
= {0};
    DWORD dwFlag 
= SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    SHGetFileInfo( FilePath, FILE_ATTRIBUTE_NORMAL, 
&sfi, sizeof( SHFILEINFO ), dwFlag );
    
return sfi.hIcon;
}

 


bool CFileAndDirCopier::FileOperation( UINT Operate, CString& SrcPath, CString& DestPath )
{
 SrcPath += _T('/0');   //--: PC相上要加该行, wince下可不用
 SHFILEOPSTRUCT fp = {0};
 fp.hwnd  = GetSafeHwnd();
 fp.wFunc = Operate;
 fp.pFrom = SrcPath.GetBuffer( SrcPath.GetLength() + 1 );
 fp.pTo  = DestPath.GetBuffer( DestPath.GetLength() + 1 );
 fp.fFlags = 0;
 
 int rt = SHFileOperation( &fp );
 SrcPath.ReleaseBuffer();
 DestPath.ReleaseBuffer();
 return ( rt == 0 );
}

 使用部分函数:
void CFileAndDirCopier::OnBnClickedButtonCopy()
{
 UpdateData( TRUE );

 FileOperation( FO_COPY, m_SrcPath, m_DestPath );

 return;
}

void CFileAndDirCopier::OnBnClickedButtonMove()
{
 UpdateData( TRUE );

 FileOperation( FO_MOVE, m_SrcPath, m_DestPath );

 return;
}

void CFileAndDirCopier::OnBnClickedButtonRename()
{
 UpdateData( TRUE );

 FileOperation( FO_RENAME, m_SrcPath, m_DestPath );

 return;
}

void CFileAndDirCopier::OnBnClickedButtonDelete()
{
 UpdateData( TRUE );

 FileOperation( FO_DELETE, m_SrcPath, m_DestPath );

 return;
}


 

1. 使用SHGetFileInfo 函数提取文件ICON:

// ---------------------------------------------------------------------------------------------------------------
//    头文件  ICONExtracter.h
// ---------------------------------------------------------------------------------------------------------------
class  CIconExtracter
{
public:
    CIconExtracter(
void);
    
~CIconExtracter(void);
public:
    HIMAGELIST    GetDirIconsList( 
const TCHAR* DirPath, bool bSmallIcon );
    UINT        GetDirIndex( 
bool bSmallIcon );
    UINT        GetFileIndex( 
const TCHAR* FilePath, bool bSmallIcon );
    HICON        GetDirIcon( 
bool bSmallIcon );
    HICON        GetFileIcon( 
const TCHAR* FilePath, bool bSmallIcon );
}
;

// ---------------------------------------------------------------------------------------------------------------
//    实现文件 iconextracter.cpp
// ---------------------------------------------------------------------------------------------------------------

#include 
" .iconextracter.h "

CIconExtracter::CIconExtracter(
void )
{
}


CIconExtracter::
~ CIconExtracter( void )
{

}


HIMAGELIST    CIconExtracter::GetDirIconsList( 
const  TCHAR *  DirPath,  bool  bSmallIcon )
{
    SHFILEINFO sfi;
    DWORD dwFlag 
= SHGFI_SYSICONINDEX;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    
return (HIMAGELIST)SHGetFileInfo( DirPath, 0&sfi, sizeof( SHFILEINFO ), dwFlag );
}


UINT CIconExtracter::GetDirIndex( 
bool  bSmallIcon )
{
    SHFILEINFO sfi;
    DWORD dwFlag 
= SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    SHGetFileInfo( _T(
"other"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof( SHFILEINFO ), dwFlag );
    
return sfi.iIcon;
}


UINT CIconExtracter::GetFileIndex( 
const  TCHAR *  FilePath,  bool  bSmallIcon )
{
    SHFILEINFO sfi;
    DWORD dwFlag 
= SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    SHGetFileInfo( FilePath, FILE_ATTRIBUTE_NORMAL, 
&sfi, sizeof( SHFILEINFO ), dwFlag );
    
return sfi.iIcon;
}


HICON    CIconExtracter::GetDirIcon( 
bool  bSmallIcon )
{
    SHFILEINFO sfi;
    DWORD dwFlag 
= SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    SHGetFileInfo( _T(
"no mattor"), FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof( SHFILEINFO ), dwFlag );
    
return sfi.hIcon;
}


HICON    CIconExtracter::GetFileIcon( 
const  TCHAR *  FilePath,  bool  bSmallIcon )
{
    SHFILEINFO sfi
= {0};
    DWORD dwFlag 
= SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
    dwFlag 
|= bSmallIcon ? SHGFI_SMALLICON : SHGFI_LARGEICON;
    SHGetFileInfo( FilePath, FILE_ATTRIBUTE_NORMAL, 
&sfi, sizeof( SHFILEINFO ), dwFlag );
    
return sfi.hIcon;
}

2. 通过SHFileOperation 外壳函数来拷贝目录及文件:  
    -- 函数原型如:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shfileoperation.asp 
注: 在使用CString做为参数时,要用GetBuffer方式来读取原字串否则会出一些copy的错误.

bool   CopyFoldeAndFiles( CString &  SrcFile, CString &  DestFile )
{
    SHFILEOPSTRUCT fp 
=  { 0 };
    fp.hwnd      
=  GetSafeHwnd();
    fp.wFunc    
=  FO_COPY;
    fp.pFrom    
=  SrcFile.GetBuffer(SrcFile.GetLength()  +   1 );
    fp.pTo        
=  DestFile.GetBuffer(DestFile.GetLength()  +   1 );
    fp.fFlags    
=   0 ;
    
int  rt  =  SHFileOperation(  & fp );
    SrcFile.ReleaseBuffer(SrcFile.GetLength() 
+   1  );
    DestFile.ReleaseBuffer(SrcFile.GetLength() 
+   1  );
    
return  ( rt  == 0 );
}

 


 

2. 通过SHFileOperation 外壳函数来拷贝目录及文件:  
    -- 函数原型如:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shfileoperation.asp 
注: 在使用CString做为参数时,要用GetBuffer方式来读取原字串否则会出一些copy的错误.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值