设为首页 加入收藏

TOP

模板应用(1) 浅析API的设计 (二)
2014-11-24 00:33:16 来源: 作者: 【 】 浏览:45
Tags:模板 应用 浅析 API 设计
h()
3{
4 T szExePath[MAX_PATH];
5 select_variable::value>(GetModuleFileNameA,GetModuleFileNameW)(NULL,szExePath);
6 return szExePath;
7}
(3)内部实现类型化,比如计算某一目录或文件的大小,因内部用到了FirstFirstFile和FirstNextFile,而这两个API不仅路径,而且WIN32_FIND_DATA结构体都有A和W版本,因此需要选择定义正确的结构体变量和调用正确的API函数,如下所示:

1template
2inline ULONGLONG GetDirSize(const charT* path)
3{
4 int ret = IsDirectoryOrFile(path);
5 if (0==ret) return 0L;
6
7 std::basic_string strPath = path;
8 if (1==ret)
9 {
10 if (strPath.length() - 1 != strPath.rfind((charT)'\\'))
11 strPath += (charT)'\\';
12 strPath += select_variable::value>("*.*",L"*.*");
13 }
14 ULONGLONG ullSumSize = 0;
15 typename select_type::value,WIN32_FIND_DATAA,WIN32_FIND_DATAW>::type findData;
16 HANDLE hFindFile = select_variable::value>(FindFirstFileA,FindFirstFileW)(strPath.c_str(), &findData);
17
18 for(BOOL bResult = (hFindFile != INVALID_HANDLE_VALUE);
19 bResult; bResult = select_variable::value>(FindNextFileA,FindNextFileW)(hFindFile, &findData))
20 {
21 if(findData.cFileName[0] == (charT)'.')
22 continue;
23 if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
24 {
25 strPath = strPath.substr(0,strPath.rfind((charT)'\\')+1)+findData.cFileName;
26 ullSumSize += GetDirSize(strPath.c_str(), bExitCalc);
27 }
28 else
29 ullSumSize += (((ULONGLONG)findData.nFileSizeHigh) << 32) + findData.nFileSizeLow;
30 }
31 ::FindClose(hFindFile);
32 return ullSumSize;
33}


摘自 天道酬勤

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言中可变参数的用法 下一篇Beej’s Guide Network to Progra..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: