项目调试之小工具---文件名替换
生活随笔
收集整理的這篇文章主要介紹了
项目调试之小工具---文件名替换
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
效果圖:
一款可圈可點(diǎn)的改名小工具設(shè)計(jì)實(shí)現(xiàn)還是不錯(cuò)的,主要實(shí)現(xiàn)代碼如下:
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>/// 是否中斷更名,比如正則錯(cuò)誤時(shí),要中斷/// </summary>private bool cancel = false;/// <summary>/// 檢查是否數(shù)字的正則/// </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>/// 檢查是否中文數(shù)字的正則/// </summary>Regex regChNum = new Regex(@"^[" + chNum + "]*$", RegexOptions.Compiled);/// <summary>/// 提取舊文件名的正則/// </summary>Regex regOldName = new Regex(@"\\o(\d+)?(?:-(\d+))?", RegexOptions.Compiled);/// <summary>/// 驗(yàn)證文件名是否合法的正則/// </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; // 文件列表的序號(hào) private SortedList<string, int> files = new SortedList<string, int>(); // 保存文件列表,因?yàn)長istView判斷Contains慢,用這個(gè)代替// 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 "數(shù)字編號(hào)":default:regValid = regNum;regReplace = @"[^\d]";break;case "大寫字母":regValid = regUpChar;regReplace = @"[^" + chUpChar + "]";break;case "小寫字母":regValid = regLowChar;regReplace = @"[^" + chLowChar + "]";break;case "漢字編號(hào)":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 "數(shù)字編號(hào)":default:txtSnBegin.Text = "1";break;case "大寫字母":txtSnBegin.Text = "A";break;case "小寫字母":txtSnBegin.Text = "a";break;case "漢字編號(hào)":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("請(qǐng)先添加文件");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("請(qǐng)先添加文件");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 + "個(gè),失敗" + failCnt + "個(gè)");}#endregion#region 主要方法,根據(jù)配置修改文件名StringBuilder sbForOld = new StringBuilder();/// <summary>/// 根據(jù)配置修改文件名/// </summary>/// <param name="name"></param>/// <param name="idx">處理到第幾個(gè)文件了</param>/// <param name="rename">是否執(zhí)行文件重名,返回時(shí),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時(shí)使用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;}// 序號(hào)處理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{// 使用舊文件名中的單個(gè)字符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;// 反轉(zhuǎn)大小寫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;// 反轉(zhuǎn)大小寫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)){// 文件名等于自己時(shí),先重命名為臨時(shí)格式,再重命名回來,比如不改名,只是大小寫替換時(shí)string tmpName = Path.Combine(fileDir, Guid.NewGuid().ToString());File.Move(name, tmpName);File.Move(tmpName, newName);}else{cancel = !chkContinue.Checked;rename = false;ret = "文件已經(jīng)存在:" + newName + " 舊文件名:" + name;}}elseFile.Move(name, newName);//rename = true;// 判斷為true進(jìn)來的,沒必要再賦值}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); // 序號(hào)的最小長度string padleft; // 序號(hào)長度不足時(shí),前面補(bǔ)充的字符string tmp = string.Empty;switch (lstSnType.Text){//case "數(shù)字編號(hào)":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 "漢字編號(hào)":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; // 從最后一個(gè)字符開始處理var carr = true; // 是否進(jìn)位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("已經(jīng)在最前頭了,我把它移哪去?");// 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會(huì)導(dǎo)致順序號(hào)錯(cuò)亂//}}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("已經(jīng)在最后頭了,我把它移哪去?");// 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("已經(jīng)在最前頭了,我把它移哪去?");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("已經(jīng)在最后頭了,我把它移哪去?");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);}}}} }轉(zhuǎn)載于:https://www.cnblogs.com/brainmao/archive/2011/07/15/2107461.html
總結(jié)
以上是生活随笔為你收集整理的项目调试之小工具---文件名替换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搜索引擎的抓取
- 下一篇: 基于DirectX的游戏引擎-Xworl