讀取文件圖標及目錄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的錯誤.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章