标题: [文件操作] 无窗命令行ezip.exe [打印本页]
作者: happy886rr 时间: 2017-5-4 00:13 标题: 无窗命令行ezip.exe
本帖最后由 happy886rr 于 2017-5-4 20:21 编辑
[易压2.0版] 增加 批量解压、批量压缩、单文件压缩、过滤空目录等新功能。一键易压,无声无息。
下载地址: https://pan.baidu.com/s/1geWEDZt
借助开源zlib写了一个zip高速压缩解压软件,实现右键一键压缩解压。程序会自动判断是否为压缩文件,智能的自动选择压缩或是解压。由于是无窗命令行,在控制台下亦可直接被批处理调用。
GUI下调用说明,直接双击ezip.exe就完成了易压的安装,右键查看zip包会有E-Zip的右键菜单和图标。所有压缩解压都是一键的,非常易捷。
命令行下调用说明:- Usage: ezip [argv] ...
- ezip [待解压zip文件]
- ezip [待压缩目录]
复制代码
经测试易压的zip压缩解压速度均高于winRAR,对于zip类型的文件有非常大的压缩优势,且不会弹出任何窗口消耗系统资源。
源码,请配合zlib库、MFC、ATL库编译。- #include "stdafx.h"
- #include "unzip.h"
- #include "zip.h"
-
- using namespace std;
-
- // 定义控制台启动方式
- #pragma comment(linker, "/subsystem:\"windows\" /entry:\"wmainCRTStartup\"")
-
- //判断注册表键值是否存在
- BOOL RegValueExist(HKEY hMainKey, LPCTSTR pSubKey, LPCTSTR pValName)
- {
- BOOL ret =FALSE;
- DWORD dwType = REG_SZ;
- HKEY hKey;
- LSTATUS nRes = RegOpenKeyEx(hMainKey, pSubKey, 0, KEY_READ, &hKey);
- if (nRes != ERROR_SUCCESS)
- {
- return FALSE;
- }
- nRes = RegQueryValueEx(hKey, pValName, NULL, &dwType, NULL, NULL);
- RegCloseKey(hKey);
- if (nRes == ERROR_SUCCESS || nRes ==ERROR_MORE_DATA)
- {
- ret = TRUE;
- }
- return ret;
- }
-
- // 注册右键快捷键值
- int REGRightKeyValue()
- {
- // 获取可执行文件全路径
- TCHAR szFilePath[MAX_PATH + 1];
- GetModuleFileName(NULL, szFilePath, MAX_PATH);
-
- CString csPathBuf=_T("\"") + (CString)szFilePath + _T("\"");
- CString csCommandBuf=_T("\"") + (CString)szFilePath + _T("\"") + _T(" ") + _T("\"%1\"");
-
- // 创建注册表键值
- HKEY hKey;
- DWORD dwDisposition;
-
- RegCreateKeyEx(HKEY_CLASSES_ROOT, _T("*\\shell\\E-Zip"), 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, &hKey, &dwDisposition);
- RegSetValueEx(hKey, _T("icon"), 0, REG_SZ, (BYTE*)(LPCTSTR)csPathBuf, csPathBuf.GetLength()*sizeof(TCHAR));
-
- RegCreateKeyEx(HKEY_CLASSES_ROOT, _T("*\\shell\\E-Zip\\command"), 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, &hKey, &dwDisposition);
- RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE*)(LPCTSTR)csCommandBuf, csCommandBuf.GetLength()*sizeof(TCHAR));
-
- RegCreateKeyEx(HKEY_CLASSES_ROOT, _T("Folder\\shell\\E-Zip"), 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, &hKey, &dwDisposition);
- RegSetValueEx(hKey, _T("icon"), 0, REG_SZ, (BYTE*)(LPCTSTR)csPathBuf, csPathBuf.GetLength()*sizeof(TCHAR));
-
- RegCreateKeyEx(HKEY_CLASSES_ROOT, _T("Folder\\shell\\E-Zip\\command"), 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_WRITE|KEY_READ, NULL, &hKey, &dwDisposition);
- RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE*)(LPCTSTR)csCommandBuf, csCommandBuf.GetLength()*sizeof(TCHAR));
-
- RegCloseKey(hKey);
-
- return 0;
- }
-
- // 从压缩包解压文件
- ZRESULT ExtractZipToDir(LPCTSTR lpszZipFullName, CStringArray& szFilePathArr, LPCTSTR lpszUnZipPath)
- {
- TCHAR buffer[MAX_PATH] = {0};
- CString strUnZipPath = lpszUnZipPath;
- DWORD zResult = ZR_OK;
-
- if (!strUnZipPath.IsEmpty())
- {
- SHCreateDirectoryEx(NULL, lpszUnZipPath, NULL);
- }
- else
- {
- GetCurrentDirectory(MAX_PATH, (LPTSTR)&buffer);
- strUnZipPath = buffer;
- SHCreateDirectoryEx(NULL, strUnZipPath, NULL);
- }
-
- HZIP hz = OpenZip(lpszZipFullName, 0);
- ZIPENTRY ze;
-
- GetZipItem(hz, -1, &ze);
- int numitems = ze.index;
-
- for (int zi = 0; zi < numitems; zi++)
- {
- ZIPENTRY ze;
- GetZipItem(hz,zi,&ze);
- zResult = UnzipItem(hz, zi, (CString)strUnZipPath+_T("\\")+ze.name);
- szFilePathArr.Add(ze.name);
-
- if (zResult != ZR_OK)
- {
- #ifndef _UNICODE
- if (_access(szFilePathArr[zi], 0))
- {
- return zResult;
- }
-
- #else
- if (_access((char *)(LPTSTR)(LPCTSTR)szFilePathArr[zi], 0))
- {
- return zResult;
- }
-
- #endif
- }
- }
-
- CloseZip(hz);
- return zResult;
- }
-
- // 递归子目录到zip文件
- ZRESULT RecursiveSubdirToZip(HZIP zf, const CString& strPath, const CString& parentDir)
- {
- CString strRelativePath;
- CFileFind finder;
- BOOL bWorking = finder.FindFile(strPath + _T("\\*.*"));
-
- while(bWorking)
- {
- bWorking = finder.FindNextFile();
- if(finder.IsDots())
- {
- continue;
- }
-
- if (parentDir == _T(""))
- {
- strRelativePath = finder.GetFileName();
- }
- else
- {
- //生成在zip文件中的相对路径
- strRelativePath = parentDir + _T("\\") + finder.GetFileName();
- }
-
- if(finder.IsDirectory())
- {
- //在zip文件中生成目录结构
- ZipAdd(zf, strRelativePath, NULL);
-
- //递归收集子目录文件
- RecursiveSubdirToZip(zf, finder.GetFilePath(), strRelativePath);
- continue;
- }
-
- //将文件添加到zip文件中
- ZipAdd(zf, strRelativePath, finder.GetFilePath());
- }
- return ZR_OK;
- }
-
- // 从目录创建zip压缩文件
- ZRESULT CompressPathToZip(const CString& dirName, const CString& zipFileName)
- {
- //创建zip文件
- HZIP newZipFile = CreateZip(zipFileName, 0);
-
- if (newZipFile == NULL)
- {
- _tprintf(_T("Can not create zip file !\n"));
- return ZR_FAILED;
- }
-
- RecursiveSubdirToZip(newZipFile, dirName, _T(""));
-
- //关闭zip文件
- CloseZip(newZipFile);
- return ZR_OK;
- }
-
- // 从文件创建zip压缩文件
- ZRESULT CompressFileToZip(LPCTSTR lpszSrcFile, LPCTSTR lpszZipName)
- {
- CString m_s=lpszSrcFile;
- HZIP hz = CreateZip(lpszZipName, 0);
-
- int ind=m_s.ReverseFind(_T('\\'));
-
- if(ind==-1)
- {
- m_s=lpszSrcFile;
- }
- else
- {
- m_s = m_s.Right(m_s.GetLength()-1-ind);
- }
-
- DWORD zResult = ZipAdd(hz, m_s, (CString)lpszSrcFile);
-
- if(zResult == ZR_OK)
- {
- CloseZip(hz);
- }
- return zResult;
- }
-
- // 唯一的应用程序对象
- CWinApp theApp;
-
- int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
- {
- int ezipMODE=0;
- CString m_InFullName;
-
- if(argc==1)
- {
- REGRightKeyValue();
- }
-
- if(argc==2)
- {
- m_InFullName=argv[1];
-
- TCHAR* tpstr=_tcsrchr(argv[1], _T('.'));
- if(tpstr && _tcsicmp(tpstr, _T(".zip"))==0)
- {
- ezipMODE=1;
- }
- else if(PathIsDirectory(m_InFullName))
- {
- ezipMODE=2;
- }
- else
- {
- ezipMODE=3;
- }
- }
- else
- {
- //_tprintf(_T("\nUsage: ezip [option] [parameter] [parameter]\n -x [source file] [extract path]\n -z [source path] [compression name]\n\n"));
- return 1;
- }
-
- int nRetCode = 0;
-
- HMODULE hModule = GetModuleHandle(NULL);
-
- if (hModule != NULL)
- {
- // 初始化 MFC 并在失败时显示错误
- if (!AfxWinInit(hModule, NULL, GetCommandLine(), 0))
- {
- // TODO: 更改错误代码以符合您的需要
- //_tprintf(_T("Error: MFC failed to initialize .\n"));
- nRetCode = 1;
- }
- else
- {
- //根据ezipMODE值执行相应函数
- if(ezipMODE==1)
- {
- CStringArray tmpNAME;
- ExtractZipToDir(m_InFullName, tmpNAME, m_InFullName.Left(m_InFullName.GetLength()-4));
- }
- else if(ezipMODE==2)
- {
- CompressPathToZip(m_InFullName, m_InFullName + _T(".zip"));
- }
- else if(ezipMODE==3)
- {
- CompressFileToZip(m_InFullName, m_InFullName + _T(".zip"));
- }
- }
- }
- else
- {
- // TODO: 更改错误代码以符合您的需要
- //_tprintf(_T("Error: get module handle failed .\n"));
- nRetCode = 1;
- }
-
- return nRetCode;
- }
复制代码
作者: codegay 时间: 2017-5-4 00:21
本帖最后由 codegay 于 2017-5-4 00:24 编辑
可以弄一个快捷键。
winrar 默认按右键后,再按X可以解。我很喜欢这种操作方式。
类似这个例子:我平常用记事本打开文字文件是按3:- Windows Registry Editor Version 5.00
-
- [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell]
- [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\用记事本打开.reg]
- @="用记事本戳开Y(&3) ^_^"
- [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\用记事本打开.reg\command]
- @="notepad.exe %1"
复制代码
作者: CrLf 时间: 2017-5-4 10:28
和 zip.exe 相比呢?
作者: happy886rr 时间: 2017-5-4 10:37
本帖最后由 happy886rr 于 2017-5-4 10:40 编辑
回复 3# CrLf
有点bug,我打算改用7z的成熟算法。EasyIFS已改成命令行版,原来的是窗口不支持命令行。单机版BCN马上完成,还在修复个别第三方中。
作者: ShowCode 时间: 2017-5-4 10:47
回复 4# happy886rr
无窗命令行7z.exe有哪些痛点需要解决呢?
作者: happy886rr 时间: 2017-5-4 20:24
回复 5# ShowCode
已修复,请下载最新2.0版,这才是最实用的。
作者: happy886rr 时间: 2017-5-4 20:26
回复 2# codegay
我把注册表弄进C语言里了,请下载2.0最新版,修复bug3处,新增一些功能。
作者: ShowCode 时间: 2017-5-4 21:34
回复 6# happy886rr
不需要了,我就用7-Zip挺好,没什么理由抛弃它。
作者: happy886rr 时间: 2017-5-4 21:56
本帖最后由 happy886rr 于 2017-5-4 22:01 编辑
回复 8# ShowCode
现在1T的硬盘也不贵,硬盘空间已经足够大了,7z不会节省太多容量。E-zip无论是zip解压速度还是zip压缩速度都完爆7z,还不费电。当7z压缩时你会看到cpu暴涨到90%,所以目前标准zip压缩方式更有前提,会成为新的趋势。这两个可以共存。
作者: ShowCode 时间: 2017-5-5 10:40
回复 9# happy886rr
建议放一些数据对比在顶楼,让大家有更加直观的震撼。比如:
大量小文件的压缩、解压
少量大文件的压缩、解压
等等
这样才能更好的体现ezip对比市面上其它软件的优势所在
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |