效果图:

一款可圈可点的改名小工具设计实现还是不错的,主要实现代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;namespace Beinet.cn.FilenameReplace
{public partial class MainForm : Form{/// <summary>/// 是否中断更名,比如正则错误时,要中断/// </summary>private bool cancel = false;/// <summary>/// 检查是否数字的正则/// </summary>Regex regNum = new Regex(@"^\d*$", RegexOptions.Compiled);const string chUpChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";/// <summary>/// 检查是否大写字母的正则/// </summary>Regex regUpChar = new Regex(@"^[" + chUpChar + "]*$", RegexOptions.Compiled);const string chLowChar = "abcdefghijklmnopqrstuvwxyz";/// <summary>/// 检查是否大写字母的正则/// </summary>Regex regLowChar = new Regex(@"^[" + chLowChar + "]*$", RegexOptions.Compiled);const string chNum = "零一二三四五六七八九";/// <summary>/// 检查是否中文数字的正则/// </summary>Regex regChNum = new Regex(@"^[" + chNum + "]*$", RegexOptions.Compiled);/// <summary>/// 提取旧文件名的正则/// </summary>Regex regOldName = new Regex(@"\\o(\d+)?(?:-(\d+))?", RegexOptions.Compiled);/// <summary>/// 验证文件名是否合法的正则/// </summary>Regex regValidFileName = new Regex(@"[\<\>\/\\\|\:""\*\?]", RegexOptions.Compiled);/// <summary>/// 记录上一次选中的目录/// </summary>private string lastSelectedFolder = string.Empty;public MainForm(){InitializeComponent();lstSnType.SelectedIndex = 0;}#region 按钮事件private int fileIdx = 1;    // 文件列表的序号 private SortedList<string, int> files = new SortedList<string, int>();  // 保存文件列表,因为ListView判断Contains慢,用这个代替// private SortedList<string, int> filenew = new SortedList<string, int>();// 保存文件新名列表private void btnAddFiles_Click(object sender, EventArgs e){OpenFileDialog dialog = new OpenFileDialog { Multiselect = true };DialogResult result = dialog.ShowDialog();if (result != DialogResult.OK){return;}foreach (var file in dialog.FileNames){if (files.ContainsKey(file))//(ContainsFile(lvFiles, file))continue;files.Add(file, 0);ListViewItem item = new ListViewItem(new[] { (fileIdx++).ToString(), file, string.Empty, string.Empty });lvFiles.Items.Add(item);}}//bool ContainsFile(ListView lv, string fileName)//{//    foreach (ListViewItem item in lv.Items)//    {//        if (item.SubItems[1].Text == fileName)//            return true;//    }//    return false;//}private void btnAddDir_Click(object sender, EventArgs e){FolderBrowserDialog dialog = new FolderBrowserDialog();if (!string.IsNullOrEmpty(lastSelectedFolder))dialog.SelectedPath = lastSelectedFolder;DialogResult result = dialog.ShowDialog();if (result != DialogResult.OK){return;}lastSelectedFolder = dialog.SelectedPath;var subdir = chkSubdirs.Checked ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;foreach (var file in Directory.GetFiles(lastSelectedFolder, "*", subdir)){if (files.ContainsKey(file))//(ContainsFile(lvFiles, file))continue;files.Add(file, 0);ListViewItem item = new ListViewItem(new[] { (fileIdx++).ToString(), file, string.Empty, string.Empty });lvFiles.Items.Add(item);}}private void btnClear_Click(object sender, EventArgs e){lvFiles.Items.Clear();files.Clear();}private void txtSnStep_TextChanged(object sender, EventArgs e){TextBox txt = sender as TextBox;if (txt == null)return;if (!regNum.IsMatch(txt.Text)){txt.Text = Regex.Replace(txt.Text, @"[^\d]", string.Empty);}}private void txtSnBegin_TextChanged(object sender, EventArgs e){TextBox txt = sender as TextBox;if (txt == null)return;Regex regValid;string regReplace;switch (lstSnType.Text){//case "数字编号":default:regValid = regNum;regReplace = @"[^\d]";break;case "大写字母":regValid = regUpChar;regReplace = @"[^" + chUpChar + "]";break;case "小写字母":regValid = regLowChar;regReplace = @"[^" + chLowChar + "]";break;case "汉字编号":regValid = regChNum;regReplace = @"[^" + chNum + "]";break;}if (!regValid.IsMatch(txt.Text)){txt.Text = Regex.Replace(txt.Text, regReplace, string.Empty);}}private void lstSnType_SelectedIndexChanged(object sender, EventArgs e){ComboBox lst = sender as ComboBox;if (lst == null)return;switch (lst.Text){//case "数字编号":default:txtSnBegin.Text = "1";break;case "大写字母":txtSnBegin.Text = "A";break;case "小写字母":txtSnBegin.Text = "a";break;case "汉字编号":txtSnBegin.Text = "一";break;}}private void chkNormalAllReplace_CheckedChanged(object sender, EventArgs e){txtNormalFrom.Enabled = !((CheckBox)sender).Checked;}private void btnHelper_Click(object sender, EventArgs e){new HelpForm().ShowDialog();}private void btnRemoveSuccess_Click(object sender, EventArgs e){for (int i = lvFiles.Items.Count - 1; i >= 0; i--){if (lvFiles.Items[i].SubItems[3].Text == "成功")lvFiles.Items.RemoveAt(i);}}#endregion#region 主要的按钮事件private void btnPreview_Click(object sender, EventArgs e){if (lvFiles.Items.Count <= 0){ShowMsg("请先添加文件");return;}lastSn = string.Empty;lastNum = 0;cancel = false;int idx = 0;int step = int.Parse(txtSnStep.Text);foreach (ListViewItem item in lvFiles.Items){if (cancel)break;string filename = item.SubItems[1].Text;var ret = false;string newName = operateName(filename, idx, ref ret);if (ret){item.SubItems[2].Text = newName;item.SubItems[3].Text = string.Empty;idx += step;}else{ShowMsg(newName);}}}private void btnGo_Click(object sender, EventArgs e){if (lvFiles.Items.Count <= 0){ShowMsg("请先添加文件");return;}lastSn = string.Empty;lastNum = 0;cancel = false;int idx = 0;int step = int.Parse(txtSnStep.Text);int sucessCnt = 0, failCnt = 0;foreach (ListViewItem item in lvFiles.Items){if (cancel)break;string filename = item.SubItems[1].Text;var ret = true;string newName = operateName(filename, idx, ref ret);if (ret){item.SubItems[2].Text = newName;item.SubItems[3].BackColor = Color.Green;item.SubItems[3].Text = "成功";sucessCnt++;}else{item.SubItems[3].BackColor = Color.Red;item.SubItems[3].Text = newName;if (cancel)ShowMsg(newName);failCnt++;}idx += step;}if (chkMoveSuccess.Checked){for (int i = lvFiles.Items.Count - 1; i >= 0; i--){if (lvFiles.Items[i].SubItems[3].Text == "成功")lvFiles.Items.RemoveAt(i);}}ShowMsg("本次操作成功" + sucessCnt + "个,失败" + failCnt + "个");}#endregion#region 主要方法,根据配置修改文件名StringBuilder sbForOld = new StringBuilder();/// <summary>/// 根据配置修改文件名/// </summary>/// <param name="name"></param>/// <param name="idx">处理到第几个文件了</param>/// <param name="rename">是否执行文件重名,返回时,true表示成功,false表示失败</param>/// <returns></returns>string operateName(string name, int idx, ref bool rename){string ret = name;string ext = string.Empty;if (chkWithExt.Checked){ret = Path.GetFileNameWithoutExtension(ret);ext = Path.GetExtension(name);}elseret = Path.GetFileName(ret);// 备份旧名,后面替换\o时使用string old = ret;//if(tabReg.Focused)switch (tabControl1.SelectedIndex){case 0:{#region 普通替换string tmp = chkNormalAllReplace.Checked ? ret : txtNormalFrom.Text;if(!string.IsNullOrEmpty(tmp))ret = ret.Replace(tmp, txtNormalTo.Text);#endregion}break;case 1:{#region 正则替换try{RegexOptions opn = chkRegIgnoreCase.Checked ? RegexOptions.IgnoreCase : RegexOptions.None;ret = Regex.Replace(ret, txtReg.Text, txtRegTo.Text, opn);}catch (Exception exp){ShowMsg(exp.ToString());cancel = true;}#endregion}break;}// 序号处理if (ret.IndexOf(@"\d") >= 0)ret = ret.Replace(@"\d", GetSn(idx));#region \o取旧文件名的字符替换处理Match m = regOldName.Match(ret);if (m.Success){sbForOld.Length = 0;sbForOld.Append(ret);while (m.Success){int mI = m.Index;sbForOld.Remove(mI, m.Length);// 移除匹配到的串if (!m.Groups[1].Success)//m.Value == @"\o"){// 使用全部旧文件名sbForOld.Insert(mI, old);}else if (m.Groups[2].Success){// 使用旧文件名中的部分// 交换大小int i1 = int.Parse(m.Groups[1].Value);int i2 = int.Parse(m.Groups[2].Value);if (i1 > i2){int i3 = i1;i1 = i2;i2 = i3;}// 小的位置存在才替换if (i1 <= old.Length){if (i2 > old.Length)i2 = old.Length;sbForOld.Insert(mI, old.Substring(i1 - 1, i2 - i1 + 1));}}else{// 使用旧文件名中的单个字符int i1 = int.Parse(m.Groups[1].Value);if (i1 <= old.Length)sbForOld.Insert(mI, old[i1 - 1]);}m = m.NextMatch();}ret = sbForOld.ToString();}#endregion#region 大小写处理if (radAllUpper.Checked)ret = ret.ToUpper();else if (radAllLower.Checked)ret = ret.ToLower();else if (radUpperFirst.Checked){// 首字母大写,其余小写ret = ret.ToLower();ret = ret.Substring(0, 1).ToUpper() + ret.Substring(1);}else if (radRevert.Checked){string tmp = string.Empty;// 反转大小写foreach (var c in ret){if (c >= 'a' && c <= 'z'){tmp += (char)(c - 32);}else if (c >= 'A' && c <= 'Z'){tmp += (char)(c + 32);}elsetmp += c;}ret = tmp;}else if (radAlterBig.Checked){// 一大写一小写string tmp = string.Empty;var i = 0;// 反转大小写foreach (var c in ret){if (i++ % 2 == 0)tmp += c.ToString().ToUpper();elsetmp += c.ToString().ToLower();}ret = tmp;}#endregionret = ret + ext;if (rename){try{string fileDir = Path.GetDirectoryName(name);string newName = Path.Combine(fileDir, ret);if (!File.Exists(name)){cancel = !chkContinue.Checked;rename = false;ret = "源文件不存在:" + name;}else if (regValidFileName.IsMatch(ret)){cancel = !chkContinue.Checked;rename = false;ret = "文件名存在非法字符:" + newName + " 旧文件名:" + name;}else if (File.Exists(newName)){if (name.Equals(newName, StringComparison.OrdinalIgnoreCase)){// 文件名等于自己时,先重命名为临时格式,再重命名回来,比如不改名,只是大小写替换时string tmpName = Path.Combine(fileDir, Guid.NewGuid().ToString());File.Move(name, tmpName);File.Move(tmpName, newName);}else{cancel = !chkContinue.Checked;rename = false;ret = "文件已经存在:" + newName + " 旧文件名:" + name;}}elseFile.Move(name, newName);//rename = true;// 判断为true进来的,没必要再赋值}catch (Exception exp){cancel = !chkContinue.Checked;rename = false;ret = exp.ToString();}}elserename = true;return ret;}#endregionstring GetSn(int idx){string ret = string.Empty;int minLen = int.Parse(txtSnBit.Text);  // 序号的最小长度string padleft;                         // 序号长度不足时,前面补充的字符string tmp = string.Empty;switch (lstSnType.Text){//case "数字编号":default:ret = (idx + int.Parse(txtSnBegin.Text)).ToString();padleft = "0";break;case "大写字母":ret = AddChar(idx, txtSnBegin.Text, chUpChar);padleft = "_";break;case "小写字母":ret = AddChar(idx, txtSnBegin.Text, chLowChar);padleft = "_";break;case "汉字编号":foreach (var c in txtSnBegin.Text){tmp += chNum.IndexOf(c);}idx += int.Parse(tmp);foreach (var c in idx.ToString()){ret += chNum[int.Parse(c.ToString())];}padleft = "零";break;}while (ret.Length < minLen)ret = padleft + ret;return ret;}private string lastSn;private int lastNum = 0;StringBuilder sbForSn = new StringBuilder();string AddChar(int idx, string begin, string arr){int len = arr.Length;string t1 = string.IsNullOrEmpty(lastSn) ? begin : lastSn;sbForSn.Length = 0;for (var i = lastNum; i < idx; i++){var m = t1.Length - 1;  // 从最后一个字符开始处理var carr = true;        // 是否进位while (carr && m >= 0){var chR = arr.IndexOf(t1[m]) + 1;char chN;if (chR >= len){chN = arr[0];//carr = true;}else{chN = arr[chR];carr = false;}sbForSn.Insert(0, chN);m--;}if (carr)sbForSn.Insert(0, arr[0]);else if (m >= 0)sbForSn.Insert(0, t1.Substring(0, m + 1));t1 = sbForSn.ToString();sbForSn.Length = 0;}lastSn = t1;lastNum = idx;return t1;}#region 51aspx下载 http://www.51aspx.com#endregion#region 右键菜单操作private void mnuDelSelected_Click(object sender, EventArgs e){if (lvFiles.SelectedItems.Count <= 0){ShowMsg("都没选择东西,你让我删啥?");return;}for (int i = lvFiles.SelectedItems.Count - 1; i >= 0; i--){var item = lvFiles.SelectedItems[i];lvFiles.Items.Remove(item);files.Remove(item.SubItems[1].Text);}}private void mnuDelAll_Click(object sender, EventArgs e){btnClear_Click(null, null);}private void mnuMovePrev_Click(object sender, EventArgs e){if (lvFiles.SelectedItems.Count <= 0){ShowMsg("都没选择东西,你让我干啥?");return;}var idx = lvFiles.SelectedItems[0].Index;//if (idx == 0)//{//    ShowMsg("已经在最前头了,我把它移哪去?");//    return;//}idx--;// 要上移一行,所以要减一var tmpArr = new List<ListViewItem>(lvFiles.SelectedItems.Count);foreach (ListViewItem item in lvFiles.SelectedItems){tmpArr.Add(item);lvFiles.Items.RemoveAt(item.Index);}foreach (var item in tmpArr){lvFiles.Items.Insert(idx++, item);}ReIndex(lvFiles);//idx--;//foreach (ListViewItem item in lvFiles.SelectedItems)for (int i = lvFiles.SelectedItems.Count - 1; i >= 0; i--)//{//    var tmp = item.SubItems[1].Text;//    item.SubItems[1].Text = lvFiles.Items[idx].SubItems[1].Text;//    lvFiles.Items[idx].SubItems[1].Text = tmp;//    idx++;//    //var item = lvFiles.SelectedItems[i];//    //lvFiles.Items.RemoveAt(item.Index);//    //lvFiles.Items.Insert(idx, item); // 直接Insert会导致顺序号错乱//}}private void mnuMoveNext_Click(object sender, EventArgs e){if (lvFiles.SelectedItems.Count <= 0){ShowMsg("都没选择东西,你让我干啥?");return;}var idx = lvFiles.SelectedItems[lvFiles.SelectedItems.Count - 1].Index;//if (idx == lvFiles.Items.Count - 1)//{//    ShowMsg("已经在最后头了,我把它移哪去?");//    return;//}idx = idx - lvFiles.SelectedItems.Count + 2;// 要下移一行,所以要加一var tmpArr = new List<ListViewItem>(lvFiles.SelectedItems.Count);foreach (ListViewItem item in lvFiles.SelectedItems){tmpArr.Insert(0, item);lvFiles.Items.RemoveAt(item.Index);}foreach (var item in tmpArr){lvFiles.Items.Insert(idx, item);}ReIndex(lvFiles);}private void mnuMoveFirst_Click(object sender, EventArgs e){if (lvFiles.SelectedItems.Count <= 0){ShowMsg("都没选择东西,你让我干啥?");return;}var idx = lvFiles.SelectedItems[0].Index;if (idx == 0){ShowMsg("已经在最前头了,我把它移哪去?");return;}var tmpArr = new List<ListViewItem>(lvFiles.SelectedItems.Count);foreach (ListViewItem item in lvFiles.SelectedItems){tmpArr.Insert(0, item);lvFiles.Items.RemoveAt(item.Index);}foreach (var item in tmpArr){lvFiles.Items.Insert(0, item);}ReIndex(lvFiles);}private void mnuMoveBottom_Click(object sender, EventArgs e){if (lvFiles.SelectedItems.Count <= 0){ShowMsg("都没选择东西,你让我干啥?");return;}var idx = lvFiles.SelectedItems[lvFiles.SelectedItems.Count - 1].Index;if (idx == lvFiles.Items.Count - 1){ShowMsg("已经在最后头了,我把它移哪去?");return;}var tmpArr = new List<ListViewItem>(lvFiles.SelectedItems.Count);foreach (ListViewItem item in lvFiles.SelectedItems){tmpArr.Add(item);lvFiles.Items.RemoveAt(item.Index);}foreach (var item in tmpArr){lvFiles.Items.Add(item);}ReIndex(lvFiles);}#endregionvoid ShowMsg(string msg){MessageBox.Show(msg);}/// <summary>/// 重新给排序/// </summary>/// <param name="lv"></param>private void ReIndex(ListView lv){var i = 1;foreach (ListViewItem item in lv.Items){item.SubItems[0].Text = i++.ToString();}}private void lvFiles_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.Delete){for (int i = lvFiles.SelectedItems.Count - 1; i >= 0; i--){var item = lvFiles.SelectedItems[i];lvFiles.Items.Remove(item);files.Remove(item.SubItems[1].Text);}}}}
}

转载于:https://www.cnblogs.com/brainmao/archive/2011/07/15/2107461.html

项目调试之小工具---文件名替换相关推荐

  1. android上调试H5小工具

    由于android上,部分网页报错,网页直接调试是看不到的或者显示不够具体,此app方便H5开发人员,查看具体错误打印.并未做到分步调试. 而部分类似格式错误,IOS上,由于本身的严谨性可能会反而不报 ...

  2. Python练手项目:PDF小工具

    python对办公一族来说,是个提高办公效率的得力利器.熟练使用它,可以轻松完成很多繁杂的事情.它可以轻松地操作Word.Excel.PDF这种文档. 今天需要整理一份资料,需要把多个pdf合并为一个 ...

  3. 微信开发者工具无法选择预览和真机调试_小程序开发 第二篇:使用微信小程序开发者工具、wepy框架初始化项目...

    1.微信小程序开发者工具 使用: 小程序原生开发:直接使用小程序开发者工具打开项目即可 小程序框架开发:首选官方提供类vue.js开发框架 wepy.js ,备选 mpVue.我们选择的是 wepy ...

  4. 【移动端debug-6】如何做一个App里的web调试小工具

    原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...

  5. 从零开始自制实现WebServer(十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章

    文章目录 全流程实现博客链接 前引 (十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章 1.正确处理Vmware-Station 处理器设置(初步调试过程) 2.正确 ...

  6. 微信开发调试小工具进化→微信用户发送信息模拟器发布!——这标题起真是好数码暴龙的说...

    直接说正题吧.最近在做微信第三方服务器.在模拟用户发过来的请求方面,网上流传着一个"微信开发调试小工具",谁做都不知道了.反正我觉得那个东西看起来挺不爽的,因为其信息发送类型不是很 ...

  7. scrapy没有运行结果_关于Scrapy爬虫项目运行和调试的小技巧(下篇)

    前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下.今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧. 三.设置网 ...

  8. 批量复制文件名-修改文件路径小工具

    简介: 批量复制文件名,文件路径小工具.昨天偶然得到的一个小工具,非常非常高效. 支持跨目录复制! 网盘下载地址: http://kekewl.cc/AOUF6Q5XVNn0 图片:

  9. 一个可以编辑sqlite数据库的 数据库编辑小工具 sqlite数据库 替换字段,sql替换数据库中某个字段的所有值

    一个可以编辑sqlite数据库的 数据库编辑小工具,由于showdoc是不支持mysql数据库的,而我们需要去修改部分数据的时候需要用到sqlite数据库工具,因此这里推荐这个轻量工具: DB.Bro ...

最新文章

  1. 谷歌等揭露「AI任务疑难」:存在局限的ImageNet等基准,就像无法代表「整个世界」的博物馆...
  2. 「树莓派+1万块乐高」打造乐高分类器,树莓派官方转发,网友:我想借来用两天...
  3. 每日一记--2014.9.22
  4. Maven打包web项目报错:webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update)
  5. 判断一个对象是否存在某个键_面向工业大数据的对象存储技术实践
  6. hiveql笔记(一)
  7. 软件测试设计与开发,软件测试技术·测试设计与开发.ppt
  8. MySQL用户及权限管理
  9. python+selenium获取cookie session_Python Selenium模拟登录成功后,使用此cookie、利用requests库进行get时,提示“非法登陆”。...
  10. 什么是epoll的水平触发与边缘触发?两段代码彻底理解
  11. 华为机试HJ85:最长回文子串
  12. 【Debug探索团队公告】Debug探索团队,邀请您的加入
  13. 【Python实例第16讲】特征集聚
  14. 5分钟入门ER/Studio
  15. 网络版瑞星服务器无法升级
  16. 计算机可移动磁盘无法显示图片,移动硬盘不显示盘符原因及解决方法步骤介绍【图文详解】...
  17. vue中使用layui实现树形菜单增删改查功能
  18. php支付宝接口参数错误,php支付接口_php支付宝支付接口程序及参数详解
  19. win7修改网络计算机名字,Win7系统中不能修改计算机名字是怎么回事?
  20. 【SCI投稿委婉催稿信模板】

热门文章

  1. golang中的反射
  2. select,poll,epoll区别面试常问
  3. golang操作redis
  4. muduo之Logger
  5. oracle: 在sqlplus中,执行sql语句
  6. [译]使用 Rust 开发一个简单的 Web 应用,第 4 部分 —— CLI 选项解析
  7. Additive属性动画
  8. ibatis轻松入门
  9. bash/shell的字符串trim实现
  10. vSphere 5.0系列之二 vSphere Client的安装