用过kindle的童鞋知道,kindle的documents目录下,会产生很多类似于下面的临时文件夹。
最新版软件下载地址:https://pan.baidu.com/s/1eSPG4RS
主要是,即便你在kindle上删除了书籍,这些临时文件夹依然存在,有没有办法只删除哪些已经看完的书籍的临时文件呢?
如果直接搜索.sdr和.dir目录,会将所有的目录列出来,不方便筛选,于是我写了这个小工具,只删除没有对应书籍的临时目录!
直接将kindle的documents目录拖拽到小工具,选择移动目录(防止误删,一般不会误删,搜寻逻辑没问题),确定即可!
这时,会在移动目录中保留被删除的目录(实际上是移动,防止误删,保持了目录结构!)。
核心代码:
//author:autumoon
//日期: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;
intnItemNum = m_listItems.GetItemCount();
for(inti =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);
//开始显示进度
CTaskBarProgresstbp(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(inti =0; i < nItemNum; ++i)
{
const_tstring& stCurDir = vItems[i];
//如果是目录
if(PathIsDirectory(stCurDir.c_str()) && CStdStr::AddSlashIfNeeded(stCurDir) != stDstDir)
{
//处理文件夹
std::vector<_tstring> vSubDirs;
size_tnSubDirCount = getDirs(stCurDir, vSubDirs,true);
for(intj =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);
}
}
}
/*********************************这里增加主程序 结束***************************************/
//结束耗时
intnMin =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);
#ifdefDLG_ELAPSED_TIME
CString strTips;
strTips.Format(_T("本次耗时 %d分%d秒%d毫秒!"), nMin, nSecond, nMilliSecond);
AfxMessageBox(strTips);
#else
AfxMessageBox(IDS_PROCESS_OVER);
#endif// DLG_ELAPSED_TIME
欢迎交流与讨论。