设为首页 加入收藏

TOP

VS源文件提取工具vsjuicer 实现细节(二)
2014-11-23 19:26:29 来源: 作者: 【 】 浏览:67
Tags:源文件 提取 工具 vsjuicer 实现 细节
持3条命令:

vsj / 或vsj /help
vsj path
vsj path /c
因此m_argc只能是2或3,接着再分别对参数个数为2和3两种情况分别进行判断。check_arguments调用了私有方法is_path_valid,其作用是检查path是否有效,其定义为:

// is path valid
BOOL is_path_valid()
{
if(!::PathFileExists(m_argv[1]))
return FALSE;
if(::PathIsDirectory(m_argv[1]) != FILE_ATTRIBUTE_DIRECTORY)
return FALSE;
return TRUE;
}
is_path_valid方法调用两个API函数来实现。

如果用户键入命令的意图是对path目录下的文件进行清理,check_arguments方法的返回值就是VSJT_JUICE。接着,juice方法就会被调用。前面已经说过,juice方法是程序最重要的部分,其实现相对复杂一些,我们先理一理思路:

path目录下既包括普通文件,也包括子目录。
对普通文件来说,我们只需判断其后缀名是否为.sdf,.suo或.aps。如果是则删除之,否则就保留它。
对于子目录来说,首先要判断它的名字是否为ipch,debug或release。如果是则直接删除整个文件,否则就进入该目录,递归进行处理。
基于这样的思路,juice方法将是一个递归方法,传入参数pszPath是目录的全路径。juice方法的代码如下,稍微有一点复杂,随后我会对它进行说明。

// juice
void juice(PTSTR pszPath)
{
// delete folder if matched
PTSTR pszFolderName = folder_name(pszPath);
if(pszFolderName) {
if( ::lstrcmpi(pszFolderName, _T("ipch\\")) == 0 ||
::lstrcmpi(pszFolderName, _T("debug\\")) == 0 ||
::lstrcmpi(pszFolderName, _T("release\\")) == 0 ) {
__int64 nSize = folder_size(pszPath);
if(delete_item(pszPath)) {
m_dwFolderCount++;
m_nFileSize += nSize;
}
return;
}
}
// delete files if matched
TCHAR szSubPath[MAX_PATH];
TCHAR szFileName[MAX_PATH];
::lstrcpy(szFileName, pszPath);
::PathAddBackslash(szFileName);
::lstrcat(szFileName, _T("*.*"));
WIN32_FIND_DATA fd;
BOOL bRet = TRUE;
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;
}
// match and delete
::memset(szSubPath, 0, sizeof(TCHAR)*MAX_PATH);
::lstrcpy(szSubPath, pszPath);
::PathAddBackslash(szSubPath);
::lstrcat(szSubPath, fd.cFileName);
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
juice(szSubPath);
else {
PTSTR pszExtension = ::PathFindExtension(szSubPath);
if( ::lstrcmpi(pszExtension, _T(".sdf")) == 0 ||
::lstrcmpi(pszExtension, _T(".suo")) == 0 ||
::lstrcmpi(pszExtension, _T(".aps")) == 0 )
if(delete_item(szSubPath)) {
m_dwFileCount++;
m_nFileSize += (fd.nFileSizeHigh * ((__int64)MAXDWORD+1)) + fd.nFileSizeLow;
}
}
bRet = ::FindNextFile(hSearch, &fd);
}// end while
::FindClose(hSearch);
}
首先判断目录名称是否为ipch,debug或release,如果是则直接删除它,否则遍历该目录,分别处理各个文件和子目录。对于子目录的处理是递归调用juice方法来实现的。

juice方法调用了folder_name方法,它的作用是从目录全路径字符串中分解出目录的名称,本质是字符查找。其实现如下所示:

// folder name
PTSTR folder_name(PTSTR pszPath)
{
::PathAddBackslash(pszPath);
int nLen = ::lstrlen(pszPath);
for(int i = nLen - 2; i > -1; --i)
if(pszPath[i] == _T('\\') || pszPath[i] == _T('/'))
return pszPath + i + 1;
return NULL;
}
juice方法还调用了folder_size方法,它的作用是获取某个目录中所有文件的

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

评论

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