【原创】如何获取系统目录和文件信息

新建一个单文档程序GetExtractIcon

修改CGetExtractIconView类的OnDraw函数如下

void CGetExtractIconView::OnDraw(CDC* pDC)
{
    CGetExtractIconDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    char szSysDir[MAX_PATH+1];
    char szWinDir[MAX_PATH+1];
    char szcurDir[MAX_PATH+1];
    char szTmpPath[MAX_PATH+1];
    char szPathName[MAX_PATH+1];
    //System目录
    GetSystemDirectory(szSysDir,MAX_PATH);
    //Windows目录
    GetWindowsDirectory(szWinDir,MAX_PATH);
    //当前目录
    GetCurrentDirectory(MAX_PATH,szcurDir);
    //临时目录
    GetTempPath(MAX_PATH,szTmpPath);
    //程序完整路径
    GetModuleFileName(NULL,szPathName,MAX_PATH);
 
    pDC->TextOut(10,100,CString("SystemDirectory - ") + CString(szSysDir));
    pDC->TextOut(10,120,CString("WindowsDirectory - ") + CString(szWinDir));
    pDC->TextOut(10,140,CString("CurrentDirectory - ") + CString(szcurDir));
    pDC->TextOut(10,160,CString("TempPath - ") + CString(szTmpPath));
    pDC->TextOut(10,180,CString("PathName - ") + CString(szPathName));
 
    //记事本的路径
    CString strFileName=szSysDir + CString("\\notepad.exe");
    SHFILEINFO stFileInfo;
    
    //得到文件信息
    if(::SHGetFileInfo(strFileName,0,&stFileInfo,sizeof(stFileInfo),
        SHGFI_ICON | SHGFI_DISPLAYNAME | SHGFI_TYPENAME))
    {
        pDC->DrawIcon(10,10,stFileInfo.hIcon);
        pDC->TextOut(50,10,CString(stFileInfo.szDisplayName));
        pDC->TextOut(50,30,CString(stFileInfo.szTypeName));
    }
    //使用ExtractIcon得到explorer的图标
    HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),"explorer.exe",0);
    if(hIcon && hIcon!=(HICON)-1)
        pDC->DrawIcon(10,50,hIcon);
}

SHFILEINFO结构体的原型:

typedef struct _SHFILEINFO{ 
    HICON hIcon;  //图标的句柄
    int   iIcon;   //图标的索引
    DWORD dwAttributes;   //文件的属性
    TCHAR szDisplayName[MAX_PATH];  //包含文件的名称
    TCHAR szTypeName[80];   //文件类型
} SHFILEINFO; 

SHGetFileInfo函数原型:

DWORD_PTR SHGetFileInfo(
    LPCTSTR pszPath, //包含路径和文件名
    DWORD dwFileAttributes, //文件的属性,如果uflags不包括
               //SHGFI_USEFILEATTRIBUTES标志, 这个参数将被忽略
    SHFILEINFO *psfi,  //SHFILEINFO类型的指针,用来接收文件信息
    UINT cbFileInfo, //SHFILEINFO类型的大小
    UINT uFlags //这个标准指定文件信息检索
);

uFlags标志可以是以下值的组合:

SHGFI_ATTR_SPECIFIED
SHGFI_ATTRIBUTES
SHGFI_DISPLAYNAME
SHGFI_EXETYPE
SHGFI_ICON
SHGFI_ICONLOCATION
SHGFI_LARGEICON
SHGFI_LINKOVERLAY
SHGFI_OPENICON
SHGFI_PIDL
SHGFI_SELECTED
SHGFI_SHELLICONSIZE
SHGFI_SMALLICON
SHGFI_SYSICONINDEX
SHGFI_TYPENAME
SHGFI_USEFILEATTRIBUTES

posted @ 2009-12-04 23:15  leukotrichia  阅读(1012)  评论(0编辑  收藏