C#之批量修改文件名

最近喜欢上看一些综艺节目,比如《天天向上》什么的,而且喜欢下载下来看,呵呵。

我一般是在优酷的客户端上下载,可这上面的节目视频文件命名却让我很头疼。它里面的很多节目名没有按发布的时间先后在前面加一个序号;或名字中包含了日期,却放在了后面。下载下来,文件按文件名排序,从前到后根本就是时间顺序。这样我要按时间顺序从前往后看,或都要盾某一期的节目,就得一个一个地、仔细地扫描整个存储目录,觉得十分的不便,尤其是文件数量特别多的时候!(ps:有序是多么的重要的啊!)

上个图吧:


就上图中的情况,要是中间的表示时间的片段“130130”能移到文件名的前面就好了,想了想觉得网上现有的一些改名工具,好像都没有这样的比较偏的功能,它们一般都加前后缀什么的,与我的需要不符。想想咱也也是个半吊子程序员,这点小事还是能,自己动手,丰衣足食吧!

先首:分析一下可行性吧。

看上图中所有的文件名,它都遵守一个格式。如:不可思议的旅程(11) 130130 标清.flv,它分成四段,先是一个内容名:不可思议的旅程(11),接着一个空格之前是时间:130130,再接着一个空格之后是个表示视频大小的词:标清,最后就是一个文件的格式后缀了:.flv。既然是样就好办了,我只要将一个文件名的这是段字符串解析出来,将表示时间的那放到最后前,其它的不变,这样一重命名不就成了吗。

按下这个思路,遍历整个目录,应该就成了吧!

需要的类库

主要是文件和目录操作相关的类,我这里用的有:FileInfo类DirectoryInfo类

代码:

下面是我在vs下建的一个控制台项目的主文件,注这个类只针对,我上面说的情况,所写的硬编码。要改的话也方便的。

/*
 * 描述:	批量些文件名
 * 作者:	AnYuanLzh
 * 日期:	2013/12/05
 */
using System;
using System.IO;

namespace BatchAlterFinename
{
	class Program
	{
		// 指定一个目录 
		static public string directoryPath = @"F:\Youku Files\download\有多远走多远 2013";

		static void Main(string[] args)
		{
			Console.WriteLine("开始运行,本程序...");

			// 判断给定的目录是否存在
			if (!Directory.Exists(directoryPath))
			{
				Console.WriteLine("给定的目录不存在");
				Console.WriteLine("程序结束,按任意键退出本程序结束...");
				Console.ReadKey();
				return;
			}

			// 返回当前按下目录下的文件列表
			DirectoryInfo di = new DirectoryInfo(directoryPath);
			FileInfo[] files = di.GetFiles();
			// 遍历这个目录
			int count = 0;
			foreach (FileInfo f in files)
			{
				// 获取一个文件的名字,并解析这个名字。
				string fileName = f.Name;
				// 方法1
				/*// 解析这个名字,以空格符来拆分文件名:
				// 如: “不可思议的旅程(11) 130130 标清.flv” ==> “不可思议的旅程(11)”、“130130”、“标清.flv”
				string[] nameFragments = fileName.Split(' ');
				if (nameFragments.Length == 3)
				{
					count++;
					// 重命名,将第2段前置
					string newFileName = nameFragments[1] + " " + nameFragments[0] + " " + nameFragments[2];
				    // 将第3段前置
					//string newFileName = nameFragments[2] + " " + nameFragments[0] + " " + nameFragments[1] + " " + nameFragments[3];
					// 将第4段前置
				    //string newFileName = nameFragments[3] + " " + nameFragments[0] + " " + nameFragments[1] + " " + nameFragments[2] + " " + nameFragments[4];
					f.MoveTo(Path.Combine(directoryPath, newFileName));
				}*/
				// 方法2
				// 解析这个名字,以空格符和'.'字符来拆分文件名:
				// 如: “不可思议的旅程(11) 130130 标清.flv” ==> “不可思议的旅程(11)”、“130130”、“标清"、“flv”
				string[] nameFragments = fileName.Split(' ','.');
				if (nameFragments.Length >= 4)
				{
					count++;
					// 重命名,将倒数第3段前置
					int dateIndex = nameFragments.Length - 3;
					string newFileName = nameFragments[dateIndex];
					for (int i = 0; i < nameFragments.Length; i++)
					{
						if (i == dateIndex) continue;
						if (i != nameFragments.Length - 1)
						{
							newFileName += " " + nameFragments[i];
						}
						else
						{
							newFileName += "." + nameFragments[i];
						}
					}
					f.MoveTo(Path.Combine(directoryPath, newFileName));
				}
			}

			Console.WriteLine("已经成因的修改了{0}个文件名", count);
			Console.WriteLine("程序结束,按任意键退出本程序结束...");
			Console.ReadKey();
		}

	}
}


测试通过,有图有真相:



呵呵,这样看起就方便多了。到这里,就算完了,谢谢浏览!

(如有转载,请注明出处:AnYuanLzhhttp://blog.csdn.net/anyuanlzh/article/details/17137041





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿海-程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值