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

来源:互联网 发布:泛海三江如何编程 编辑:程序博客网 时间:2024/04/29 12:06

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的错误.
原创粉丝点击