开篇先交代一下背景, 因为本人喜欢在网上下载一些无损音乐放到本地听,时间一长,导致本地存放音乐的文件夹里的文件很多,看上去很杂乱,而一首一首歌去手动创建目录又很复杂,所以今天休息的时候闲来无事,想到是不是可以做一个小工具,根据音乐文件的歌手和专辑名去自动创建目录,把文件移动到创建好的目录。

说做就做,第一步,确定需求。这里其实很简单,就是我输入一个目录,这个工具就会把该目录下的音乐文件自动移动到对应的目录,目录规则为 根目录/歌手/专辑。确定了需求,接下来就是步骤:

  1. 遍历根目录下的所有文件;
  2. 筛选其中的音乐文件(有时下载的资源包括封面图);
  3. 找出音乐文件的歌手和专辑名,并拼装好新的目录;
  4. 将当前音乐移动到指定目录

下面放一下代码,因为本人用的是Windows系统,为了省事,这次就用了C#开发(主要是WinForm用着顺手),如果大家有更好的实现方式或者更棒的算法,欢迎提出~

目录结构(其实挺简单的,Logic层完全可以省略的)

界面(也很简单,不会做美工啥的,自己用的,实现功能为主吧)

按钮部分代码(这里没什么主要逻辑,还是调用MainLogic为主):

        private void btnStart_Click(object sender, EventArgs e){string rootPath = this.tbRootPath.Text.Trim();MainLogic mainLogic = new MainLogic();if (mainLogic.isPathExist(rootPath)){try{List<string> listFile = new List<string>();DirectoryInfo directory = new DirectoryInfo(rootPath);mainLogic.findFile(listFile, directory);int num = 0;foreach(string fileName in listFile){if (mainLogic.isMusicFile(fileName)){string targetPath = rootPath;string artist = mainLogic.getArtist(fileName);string album = mainLogic.getAlbum(fileName);if (!string.IsNullOrEmpty(artist) && !mainLogic.isAllQuestionMark(artist)){targetPath += "\\" + artist;}if (!string.IsNullOrEmpty(album) && !mainLogic.isAllQuestionMark(album)){targetPath += "\\" + album;}mainLogic.moveFile(fileName, targetPath);num++;}}showSuccessMessage("移动完成,本次处理文件" + num + "个");}catch (Exception ex){showErrorMessage(ex.Message);}}else{showErrorMessage("输入的路径不存在,请确认后操作");}}

遍历目录(这里还是使用递归,只记录文件,没有记录目录,代码部分引用自网友,感谢网友的无私分享~)

        public void findFile(List<string> listFiles, DirectoryInfo directoryInfo){FileInfo[] fileInfos = directoryInfo.GetFiles();for (int i=0; i< fileInfos.Length; i++){listFiles.Add(fileInfos[i].FullName);}DirectoryInfo[] directoryInfos = directoryInfo.GetDirectories();for (int i=0; i < directoryInfos.Length; i++){findFile(listFiles, directoryInfos[i]);}}

判断格式,因为有时会下载出封面等其他信息,我自己最后是只保留的音乐文件,所以这里没有管,如果大家有需求可以根据需要更改代码~

        /// <summary>/// 判断文件是否为音乐文件/// </summary>/// <param name="fileName"></param>/// <returns></returns>public bool isMusicFile(string fileName){string extension = Path.GetExtension(fileName);string targetExtension = ".mp3;.flac;.wma;.wav";if (targetExtension.IndexOf(extension) != -1){return true;}else{return false;}}

获取歌手和专辑信息(文件的其他信息也可以使用这个方法获取,可自行研究)

        /// <summary>/// 获取歌手名/// </summary>/// <param name="fileName"></param>/// <returns></returns>public string getArtist(string fileName){try{Shell32.Shell shell = new Shell();Folder dir = shell.NameSpace(System.IO.Path.GetDirectoryName(fileName));FolderItem item = dir.ParseName(System.IO.Path.GetFileName(fileName));string artist = dir.GetDetailsOf(item, 20);return artist;}catch (Exception ex){throw ex;}}/// <summary>/// 获取专辑名/// </summary>/// <param name="fileName"></param>/// <returns></returns>public string getAlbum(string fileName){try{Shell32.Shell shell = new Shell();Folder dir = shell.NameSpace(System.IO.Path.GetDirectoryName(fileName));FolderItem item = dir.ParseName(System.IO.Path.GetFileName(fileName));string album = dir.GetDetailsOf(item, 14);return album;}catch (Exception ex){throw ex;}}

移动文件:

        /// <summary>/// 移动文件/// </summary>/// <param name="sourcefileName"></param>/// <param name="targetDir"></param>public void moveFile(string sourcefileName, string targetDir){try{if (!Directory.Exists(targetDir)){Directory.CreateDirectory(targetDir);}if (!File.Exists(sourcefileName)){throw new Exception("文件【" + sourcefileName + "】不存在,请检查");}int index = sourcefileName.LastIndexOf("\\");string fileName = sourcefileName.Substring(index);string targetDestination = targetDir + fileName;if (!File.Exists(targetDestination)){File.Move(sourcefileName, targetDestination);//File.Delete(sourcefileName);}}catch (Exception ex){throw ex;}}

后期发现一个问题,有些文件因为资源问题,专辑名和歌手都是问号,这里如果没有发现的话,就会造成有带问号的文件夹,还得自己处理,这里的办法是对这类文件不做处理,不拼接目录名,具体代码在上面界面的部分,下面为判断是否全部为问号的代码:

        /// <summary>/// 校验信息是否全为问号(有些歌曲文件会出现这种问题,可交由人工判断,或完成填写后使用)/// </summary>/// <param name="info"></param>/// <returns></returns>public bool isAllQuestionMark(string info){bool result = true;for (int i=0; i<info.Length; i++){if (info[i] != '?'){result = false;break;}}return result;}

好了,至此就是这个小工具截至目前的主要代码,详细代码可以在这里看到:https://github.com/RazrZhang/MusicFilesHandler

小工具初版下载:

链接:https://pan.baidu.com/s/1T1pTYJn2JLaHmuLr1U-R8g
提取码:rr87
运行效果大概是下面的样子

整理前

软件界面

整理完成

整理后

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

写在最后:这个工具完成后比我预想的要简单一些,本来以为不同格式的文件要分开处理,但是后来发觉不需要,添加一个引用直接就完事了~这个工具运用System.IO这个库比较多,自己之前用这个类库用的也不是很多, 这次就当是做了一个练习吧,也想过用Java做,毕竟自己主攻方向是Java,但是自己GUI学的不咋地,而且又不如WinForm直接拖过来用就完事了,所以暂且就用C#吧,能达到目的就好,语言只是一种手段,不需要太多的纠结。当然这个工具也仅仅是实现了简单功能,能把大部分音乐进行比较好的分类,有些多歌手的,做的还不是很好,所以后期还会继续改进,有其他更好想法的朋友可以提出想法,我也会适当参考的~

音乐文件自动整理工具相关推荐

  1. PNG字幕文件自动生成工具

    最近在PR中做视频需要加字幕,虽然有很多字幕工具,但是个人不喜欢用. 用PS做大段的文字又太费时,所以写了一个字幕文件自动生成工具,其实就是自动批量输出透明的PNG文件.

  2. 服务器文件自动备份工具

    网站经常需要定期备份文件,天天折腾累死人 ,索性写了个自动备份 的工具,让它运行在服务器上,每天凌晨自动将需要备份的数据打包成压缩文件并传到另外的服务器. 1.定时执行任务,用到开源框架Quartz. ...

  3. 文件整理工具Folder Tidy Mac版

    Folder Tidy Mac版是mac上一款非常强大的文件整理工具,用户只需要选择需要清理的文件夹,眨眼功夫,所有的文件就会按照类别(照片.音乐.文档等等)分别整理好,并得到一个名为"x月 ...

  4. 一键自动整理文件!简单好用的Python脚本

    我以前经常把下载的东西放在桌面或者"下载"文件夹中,使用后再也没管它,久而久之文件夹就变得乱七八糟,再整理的时候非常痛苦,巴不得有一个自动化的工具帮我归类文档. 不知道你是不是有过 ...

  5. Python一键自动整理归类文件,GUI窗口程序拿来即用

    应黄同学<用Python写了个小工具,再复杂的文件夹,分分钟帮你整理,拿来即用!>一文的邀请,谁写个gui并给他投稿就送书. 那么我考虑大家的需要,结合实际,按照自己的思路写下了这个小工具 ...

  6. Windows10电脑文件自动同步备份工具有哪些?

    对于工作中的重要数据人们一般都会有备份的习惯,但是如果都是人工手动复制粘贴,那效率会非常低下.Windows10中电脑文件自动同步备份工作有哪些? 工具1:FileYee 推荐值:★★★★★ 软件优势 ...

  7. 怎么把音乐文件转成mp3格式?这4个方法帮你轻松搞定

    分享4个好用的音乐文件转换工具,支持多种音乐格式的转换,亲测好用! 一.加密音乐格式转换 1.音乐解锁 一个加密音乐格式转换在线工具,支持多个音乐平台的音乐格式转换,页面简洁,使用也方便,打开之后就可 ...

  8. linux文件整理归档分类工具 - 设定分类规则,自动整理归档

    linux文件整理工具 classifier(命令行工具) easy-file-organizer(图形化) classifier(命令行工具) 可按文件后缀分类,分类规则可自定义 可按创建日期分类 ...

  9. shchangenotifyregister 监视子文件夹文件改变_有哪些神器能自动整理电脑文件?

    使用 DropIt 高效整理电脑文件https://www.zhihu.com/video/1152258455912910848 我喜欢我的电脑,最新版 Windows10 搭配极简.轻松的壁纸,以 ...

最新文章

  1. mysql二进制还原表_MYSQL 二进制还原
  2. 【 MATLAB 】DFT性质讨论(一)线性、循环反转、共轭与实序列的对称性
  3. resize函数_Excel VBA解读(134): 使用Excel函数提高自定义函数的效率
  4. 【AI】人工智能深度学习入门路线
  5. pandas python csv_python:pandas合并csv文件的方法(图书数据集成)
  6. 4道Python装饰器练习题
  7. servlet怎么接受请求_谁再问Servlet的问题,我就亲自上门来教学了
  8. ES6语法---const和symbol
  9. 全局中断_【安全圈】微软更新造成Office 365等多个在线服务中断!
  10. python实现原始字典数据中键值互换得到新的字典数据
  11. 探索与发现,我们在路上
  12. jquery ajax回调函数带入参数
  13. 全国各地货运量(全国与各省级指标,2005-2019数据分析对比)
  14. android pad刷机,小白必看,安卓平板电脑刷机教程之一键刷机
  15. 《可复制的领导力》脑图
  16. ym——Android从零开始(3)(常用控件+下拉框视图)(新)
  17. truetype字体怎么转换成普通字体_TrueType字体作用|如何在文档嵌入 TrueType 字体中...
  18. 全栈修炼:如何从Web前端迈向全栈开发
  19. mysql函数循环查询的数据_MySQL 查询树结构、循环查询、查看函数、视图、存储过程...
  20. 论文阅读:Pointwise Convolutional Neural Networks

热门文章

  1. 山西民生云登录显示服务器异常,山西民生云服务器异常
  2. C语言函数实现ascii码快速查询
  3. 样式集(14)填写信息弹窗
  4. 执行python manage.py migrate报错问题解决
  5. Java全栈开发---Java ERP系统开发:商业ERP(一)UML建模工具的使用
  6. 平时开发搜集的一些网址
  7. 《计算机的硬件系统》教案,计算机硬件系统的组成教案
  8. 联想笔记本键盘亮屏幕不亮_联想笔记本电脑开机键亮但是黑屏 联想笔记本电脑键盘失灵怎么办...
  9. 雨林木风linux安装教程,雨林木风修复win7系统虚拟机安装linux提示network error的办法...
  10. css学习--css基础