用过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
欢迎交流与讨论。