kindle清理小工具(清理临时文件夹)

87 篇文章 4 订阅

用过kindle的童鞋知道,kindle的documents目录下,会产生很多类似于下面的临时文件夹。

最新版软件下载地址:http://pan.baidu.com/s/1eSPG4RS

主要是,即便你在kindle上删除了书籍,这些临时文件夹依然存在,有没有办法只删除哪些已经看完的书籍的临时文件呢?

如果直接搜索.sdr和.dir目录,会将所有的目录列出来,不方便筛选,于是我写了这个小工具,只删除没有对应书籍的临时目录!

直接将kindle的documents目录拖拽到小工具,选择移动目录(防止误删,一般不会误删,搜寻逻辑没问题),确定即可!

这时,会在移动目录中保留被删除的目录(实际上是移动,防止误删,保持了目录结构!)。

核心代码:

//author:autumoon
//联系QQ:4589968
//日期:2021-02-02
	// TODO:  在此添加命令处理程序代码
	CString strDstDir;
	GetDlgItemText(IDC_EDIT_DIR, strDstDir);

	if (!strDstDir.GetLength())
	{
		strDstDir = CMfcStrFile::BrowseDir(true, "选择移动文件到哪个文件夹");
		if (strDstDir.GetLength() > 0)
		{
			SetDlgItemText(IDC_EDIT_DIR, strDstDir);
		}
		else
		{
			return;
		}
	}

// 	if (strSrcDir == strDstDir)
// 	{
// 		MessageBox(_T("源地址和目标地址不能相同!"), _T("警告!"), MB_ICONWARNING);
// 		return;
// 	}

	std::vector<_tstring> vItems;
	int nItemNum = m_listItems.GetItemCount();
	for (int i = 0; i < nItemNum; ++i)
	{
		CString strCurItem = m_listItems.GetItemText(i, 0);
		_tstring stCurItem = CMfcStrFile::CString2string(strCurItem);
		vItems.push_back(stCurItem);
	}

	_tstring stDstDir = CMfcStrFile::CString2string(strDstDir);
	if (vItems.size() == 0 || !CStdDir::IfAccessDir(stDstDir) && !CStdDir::CreateDir(stDstDir))
	{
		return;
	}

	//获取文件
	_tstring stSrcDir = CMfcStrFile::CString2string(strDstDir);

	if (vItems.size() == 0)
	{
		AfxMessageBox(_T("请添加Kindle目录!"));
		return;
	}

	//保存配置文件
	m_cfg.vItemPaths = vItems;
	m_cfg.vSrcDirs.clear();
	m_cfg.vSrcDirs.push_back(stSrcDir);
	m_cfg.vDstPaths.clear();
	m_cfg.vDstPaths.push_back(stDstDir);
	WriteIniFile(GetIniPath(), m_cfg);

	//开始显示进度
	CTaskBarProgress tbp(m_hWnd);
	CProgressInterface* ppi = &tbp;
	ppi->Start();
	CElapsedTime et;

	//记录日志
	CLOG::Out(_T("%s"), _T("start task!"));
	//记录耗时
	et.Begin();
	/*********************************这里增加主程序 开始***************************************/
	//处理所有项目,推荐判断项目是否存在
	stDstDir = CStdStr::AddSlashIfNeeded(stDstDir);
	const _tstring stDstItem = stDstDir;

	for (int i = 0; i < nItemNum; ++i)
	{
		const _tstring& stCurDir = vItems[i];
		//如果是目录
		if(PathIsDirectory(stCurDir.c_str()) && CStdStr::AddSlashIfNeeded(stCurDir) != stDstDir)
		{
			//处理文件夹
			std::vector<_tstring> vSubDirs;
			size_t nSubDirCount = getDirs(stCurDir, vSubDirs, true);
			for (int j = 0; j < nSubDirCount; ++j)
			{
				_tstring stSubSrcDir = vSubDirs[j];

				//如果该文件是需要被处理的文件
				_tstring strName = CStdStr::GetNameOfDir(stSubSrcDir);

				//文件夹名中必须包含.dir
				if (strName.find(".dir") != _tstring::npos)
				{
					_tstring stFileName = stSubSrcDir.substr(0, stSubSrcDir.length() - 4);

					//sdr目录
					_tstring stSdrDir = CStdStr::AddSlashIfNeeded(CStdStr::GetDirOfFile(stFileName)) + CStdStr::GetNameOfFile(stFileName, false) + ".sdr";

					if (!CStdFile::IfAccessFile(stFileName))
					{
						//移动到目标目录
						_tstring strSubDstFile = stDstDir + stSubSrcDir.substr(CStdStr::AddSlashIfNeeded(stCurDir).length());
						_tstring strSubDir = CStdStr::GetDirOfFile(strSubDstFile);
						if (!CStdDir::IfAccessDir(strSubDir) && !CStdDir::CreateDir(strSubDir))
						{
							continue;
						}

						//移动文件夹到指定的文件夹
						moveDir(stSubSrcDir.c_str(), strSubDir.c_str());

						//如果存在sdr目录,则同时移动
						if (PathIsDirectory(stSdrDir.c_str()))
						{
							//移动到目标目录
							strSubDstFile = stDstDir + stSdrDir.substr(CStdStr::AddSlashIfNeeded(stCurDir).length());
							strSubDir = CStdStr::GetDirOfFile(strSubDstFile);
							if (!CStdDir::IfAccessDir(strSubDir) && !CStdDir::CreateDir(strSubDir))
							{
								continue;
							}

							moveDir(stSdrDir.c_str(), strSubDir.c_str());
						}
					}
				}

				ppi->SetProgressValue(j + 1, nSubDirCount);
			}
		}
	}


	/*********************************这里增加主程序 结束***************************************/

	//结束耗时
	int nMin = 0, nSecond = 0, nMilliSecond = 0;
	et.End(nMin, nSecond, nMilliSecond);
	//结束日志
	CLOG::Out(_T("%s"),_T("end task!"));
	CLOG::Out(_T("This task costs %d min %d second %d millisecond!"), nMin, nSecond, nMilliSecond);
	CLOG::End();

	//结束进度显示
	ppi->End();
	FlashWindow(TRUE);

#ifdef DLG_ELAPSED_TIME
	CString strTips;
	strTips.Format(_T("本次耗时 %d分%d秒%d毫秒!"), nMin, nSecond, nMilliSecond);
	AfxMessageBox(strTips);
#else
	AfxMessageBox(IDS_PROCESS_OVER);
#endif // DLG_ELAPSED_TIME

欢迎交流与讨论。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值