有时候有一些文件存放的目录结构非常复杂,但是实际上这样反而导致查看不方便,因为每次都要点进去子目录查看,然后又要返回,很不方便,我们希望这些文件可以整理到一个目录,但是又希望能够记得这些文件原来是在哪个目录的,于是我写了这款小工具,可以实现文件整理,并且支持目录结构恢复,这样就算万一操作错误了也没问题。
比如文件结构如下的文件:
整理之后,就变成了如下的结果,会自动删除整理之后为空的目录(非空不删除):
其中文件名保持了目录结构,并且也保留了自身的名称。
软件界面如下:
核心代码如下:
//author:autumoon
//联系邮箱:9506#163.com
//日期:2023-03-02
//处理所有项目,推荐判断项目是否存在
stDstDir = CStdStr::AddSlashIfNeeded(stDstDir);
for (size_t i = 0; i < nItemCount; ++i)
{
const _tstring stCurItem = vItems[i];
const _tstring stDstItem = stDstDir + CStdStr::GetNameOfFile(stCurItem);
#ifdef ITEM_ONLY_FILE
if (CStdFile::IfAccessFile(stCurItem) && IsProperSuffix(stCurItem, m_cfg.vSuffixs))
{
ProcessFile(stCurItem, stDstItem, m_cfg);
}
#endif // ITEM_ONLY_FILE
#ifdef ITEM_ONLY_DIR
//如果是目录
if(PathIsDirectory(stCurItem.c_str()))
{
//处理文件夹
std::vector<_tstring> vSubFiles;
size_t nSubFileCount = getFiles(stCurItem, vSubFiles, m_cfg.vSuffixs, bIncludeSub);
for (int j = 0; j < nSubFileCount; ++j)
{
_tstring stSubSrcFile = vSubFiles[j];
_tstring strSubDstFile = CStdStr::AddSlashIfNeeded(stDstItem) + CStdStr::ReplaceAllDistinct(stSubSrcFile.substr(CStdStr::AddSlashIfNeeded(stCurItem).length()), "\\", "_");
//保存到根目录
_tstring stDstFilePath = CStdStr::GetValidFilePath(strSubDstFile);
CMoveItemsLog::MoveOneItem(stSubSrcFile, stDstFilePath);
}
//自动删除空目录
std::vector<_tstring> vSubDirs;
size_t nSubDirCount = getDirs(stCurItem, vSubDirs, bIncludeSub);
for (size_t j = 0; j < nSubDirCount; ++j)
{
_rmdir(vSubDirs[j].c_str());
}
_rmdir(stCurItem.c_str());
}
#endif // ITEM_ONLY_DIR
ppi->SetProgressValue(i + 1, nItemCount);
}
软件成品暂未公开,但关键源代码已经提供了,可以参考一下,自行实现功能即可。
如果仅仅需要软件成品的,可以私信我取得联系。
想要全套源代码的,也可以私信我取得联系,一起学习交流。