今天开始写Bughue之前做过的一些小程序,当然以后如果做的话也会继续更新在上面。这些程序大多是为了实现一些自己想要的小功能做的简单程序。目前做出来的都是直接用C#写的winform程序
好了,接下来开始介绍我做的第一个小程序–批量重命名工具:重命名神器
这里给可运行文件的下载地址 点击我下载
之所以做这个东西是因为觉得整理大批资源(比如:图片,音乐,电影)的时候需要批量重命名,我在网上搜了一下没找到自己想要的东西,于是动手自己写了一个。
有人问“为什么需要批量重命名”,下面是我动手的几个原因:
1.排序:虽然现在电脑的文件排序有很多方式,但是我们总有自己希望的排序方式(当然除非你的文件夹分的非常细),我的文件夹分的已经很细了,但是还是难免有些文件夹里面东西过多而且难找到自己需要的排序方式
2.多个杂乱的文件名:有时候你下载下来的东西夹杂太多不需要的字符或者是错误的词,比如([迅雷下载www.XunBo.Cc]异次元杀阵.BD中英双字1024高清.mkv)这个时候你想要批量来修正他~~我们是不是可以做到批量的删掉“[迅雷下载www.XunBo.Cc]”这个字符串呢?或者我想保留一下但是想简洁点,能不能把“[迅雷下载www.XunBo.Cc]”改成“XunBo”呢?
3.给文件名加上自己想要的标识:这个很重要,比如你下了N首张国荣的歌,文件名都是歌名,但是你并不一定在哪都能保证他按照艺术家来排名(特别是某些手机),于是你想在文件名前面都加上张国荣三个字?或者你加在后面?
然后下面是我写的程序的功能
1.单独修改一个文件名,很简单的东西,只是觉得有时批量重命名的时候也会有些单个文件重命名的操作,所以一起做了(附带图片浏览功能)
2.批量删除选定文件名含有的某个字符串
3.批量把选定文件名内含有的某个字符串修改成另一个字符串
4.批量给选定文件的文件名前面加上某个字符串
5.批量给选定文件的文件名后面加上某个字符串
下面就是截图啦~,第一个截图附带使用说 明的
1.使用说明截图
2.修改单个文件名
3.筛选文件,为批量修改做准备
4.批量修改文件名的某个字符串
5.批量删除文件名的某个字符串
6.最后是批量给文件名前面或者后面加上某个字符串,这里的例子是张国荣的几首歌
修改后的情况↓
由于这个是刚刚学C#的时候写的,整个代码结构就很乱了,风格浮云,也就不贴出来搞晕大家了。
最后还是稍微分享下技术。都是比较基础的东西,主要是IO命名空间下跟文件和文件夹有关的一些类的使用,还有winform窗体控件的一些小分享
1.打开文件夹和读出所有文件,这个是最开始那个按钮的点击事件,完整的
private void button_Openfile_Click(object sender, EventArgs e) { try { //调用folderbrowser,非常的简单,winform的优势所在 FolderBrowserDialog open1 = new FolderBrowserDialog(); if (open1.ShowDialog() == DialogResult.OK) { listBox_Source.Items.Clear(); listBox_Change.Items.Clear(); count = 0; //下面是file类和Directory类的一些使用 DirectoryPath = open1.SelectedPath; foreach (string FilePath in Directory.GetFiles(DirectoryPath)) { if (File.Exists(FilePath)) { if (textBox_ed1.Text == "" && textBox_ed2.Text == "") listBox_Source.Items.Add(Path.GetFileName(FilePath).ToString()); else { string Extension = Path.GetExtension(FilePath); if (Extension == "." + textBox_ed1.Text || Extension == "." + textBox_ed2.Text) listBox_Source.Items.Add(Path.GetFileName(FilePath).ToString()); } } } } } catch (Exception err) { MessageBox.Show(err.Message); } }
2.然后是修改文件名
同样是我很喜欢C#的理由,类库全而且易懂也容易使用。
当时是上网搜了要使用File和Path这两个类,太具体的没去查,但是等你 . 一下,你会发现你需要的东西都在里面~什么GetFileName,GetFileNameWithoutExtension
一看就懂了。关于类型什么的如果不对再把鼠标放过去看看是什么类型,看看是要强制转换还是该怎么样。谁是谁的父类也很容易看的出来。
这里是修改单个文件名的例子
foreach (string FilePATH in Directory.GetFiles(DirectoryPath)) { if (File.Exists(FilePATH)) { if (Path.GetFileName(FilePATH).ToString() == listBox_Source.SelectedItem.ToString()) { Extension += Path.GetExtension(FilePATH); string NewName = DirectoryPath + @"/" + textBox_change.Text + Extension; File.Move(FilePATH, NewName); listBox_Source.Items.RemoveAt(listBox_Source.SelectedIndex); listBox_Source.Items.Add(textBox_change.Text + Extension); break; } } }
3.最后还是说下浏览图片吧。
用的是picturebox,同样控件类的东西很多共通的地方。在需要绑定图片路径的时候,我甚至没去查,而是直接picturebox1.XXXXX就找到了三种绑定方法
pictureBox1.Image = Image.FromFile(路径); pictureBox1.Load(路径); pictureBox1.LoadAsync(路径);
因为我自己也是试出来的,对于控件类的东西…不想深究太多所以没去查有什么不同,第二跟第三个明眼人很快看的出是同步跟异步的不同。
然后我发现了一个问题,用picturebox的image属性绑定或者用load方法绑定都会造成想修改本文件的时候没办法把资源释放掉(这里是指我没办法),也就是其他进程无法去修改这个文件。
Image.FromFile()这个东西要怎么释放资源我不懂,然后如果用load方法的话的确可以用picturebox1.dispose()去释放掉所有资源,但是一旦这样picturebox等于废了,我重新new一遍也不行。
最后我发现有个cancelasync()的方法在里面,所以就尝试了第三种,成功!
//异步的load if (Extension.Equals(".jpg") || Extension.Equals(".bmp") || Extension.Equals(".jpeg") || Extension.Equals(".png") || Extension.Equals(".gif")) { pictureBox1.LoadAsync(FilePATH); } //取消异步load,一句话搞定 pictureBox1.CancelAsync();
4.还有splitContainer这个东西推荐大家在布局略复杂的winform界面使用,具体就不说了,装个VS,属性什么的自己看,触发事件也是。
两年以来VS一直是我最好的.NET老师,超棒的智能提示–完善的控件属性窗口–强大的调试功能(断点,临时窗口,人性化的报错,还有N多我不会用的功能)各种
以上~就是bughue当年做的一个小程序(好吧我承认翻出来的时候的确有修bug和稍微做好看点)
好东西,沙发~
哪位测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试