【原创】如何获取系统目录和文件信息
新建一个单文档程序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标志可以是以下值的组合: