设为首页 加入收藏

TOP

VS源文件提取工具vsjuicer 实现细节(三)
2014-11-23 19:26:29 】 浏览:391
Tags:源文件 提取 工具 vsjuicer 实现 细节
大小之和。因为没有直接的API方法获得目录的大小,所以需递归的遍历目录中的所有文件,将它们的大小累加起来。folder_size的方法如下所示:

// folder size
__int64 folder_size(PTSTR pszPath)
{
__int64 nSize = 0;
TCHAR szFileName[MAX_PATH];
TCHAR szSubPath[MAX_PATH];
BOOL bRet = TRUE;
::lstrcpy(szFileName, pszPath);
::PathAddBackslash(szFileName);
::lstrcat(szFileName, _T("*.*"));
WIN32_FIND_DATA fd;
HANDLE hSearch = ::FindFirstFile(szFileName, &fd);
while(hSearch != INVALID_HANDLE_VALUE && bRet) {
// skip . and ..
if(::lstrcmpi(fd.cFileName, _T(".")) == 0 ||
::lstrcmpi(fd.cFileName, _T("..")) == 0) {
bRet = ::FindNextFile(hSearch, &fd);
continue;
}
// calculate size
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!= 0) {
::memset(szSubPath, 0, MAX_PATH*sizeof(TCHAR));
::lstrcpy(szSubPath, pszPath);
::PathAddBackslash(szSubPath);
::lstrcat(szSubPath, fd.cFileName);
nSize += folder_size(szSubPath);
}
else nSize += fd.nFileSizeHigh*((__int64)MAXDWORD+1) + fd.nFileSizeLow;
bRet = ::FindNextFile(hSearch, &fd);
}
::FindClose(hSearch);
return nSize;
}
folder_size内部采用了与juice内部一样的遍历方法,即调用FindFirstFile,FindNextFile以及FindClose这3个API函数来实现。

对目录和文件的删除使用了统一的方式,都是调用的delete_item来实现的。delete_item方法的定义为:

// delete item
BOOL delete_item(PTSTR pszPath)
{
TCHAR szTempPath[MAX_PATH] = { 0 };
::lstrcpy(szTempPath, pszPath);
FILEOP_FLAGS fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_ALLOWUNDO;
if(m_bComplete) fFlags &= (~FOF_ALLOWUNDO);
SHFILEOPSTRUCT fops = { NULL,
FO_DELETE,
szTempPath,
NULL,
fFlags,
FALSE,
NULL,
NULL };
int nRet = ::SHFileOperation(&fops);
return nRet == 0 TRUE : FALSE;
}
其内部调用了API函数SHFileOperation。在填充SHFILEOPSTRUCT变量fops时,根据m_bComplete的值取舍FOF_ALLOWUNDO标志。

好了,就快大功告成了,还剩下最后一个方法report,它的定义再简单不过了:

// report
void report()
{
_tprintf(_T("Juicing finished.")
_T("\n\nTarget directory: %s")
_T("\n\nDeleted\t %10d files.")
_T("\nDeleted\t %10d directories.")
_T("\n Saved\t %10.2lf kilobytes.")
_T("\n Spent\t %10d milliseconds.\n"),
m_argv[1],
m_dwFileCount,
m_dwFolderCount,
(double)m_nFileSize/1024,
m_dwMilliseconds);
}
4个整数变量的计算穿插在上述各个方法之中,比较简单,所以不在此处赘述。

这篇文件贴出了vsjuicer所用到的所有源码,读者完全可以将它们组织起来,顺利通过编译链接。如果你需要vsjuicer的solution files,请留言或发站内信索取

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇模板的使用 下一篇VC++1.5K字节实现下载并远程注入

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目