最近在弄一個(gè)文件傳輸?shù)囊粋€(gè)東東,在接收文件的時(shí)候,如果文件已經(jīng)存在,該如何處理?提示?刪除?感覺直接刪除實(shí)在不太合適,萬一這個(gè)文件對用戶來說很重要,你給他刪除了肯定不行。然后就想到了,windows系統(tǒng)在新建文件的時(shí)候,如果文件存在就以(n)這樣的形式創(chuàng)建。當(dāng)時(shí)覺得這種方式確實(shí)不錯(cuò),查找了windows的api,未果,然后就想如果讓自己實(shí)現(xiàn),該如何去實(shí)現(xiàn)?
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Text.RegularExPRessions; 7 using System.Threading.Tasks; 8 9 namespace Wolfy.SaveAs 10 { 11 /// <summary> 12 /// 重命名輔助類 13 /// </summary> 14 public class ReNameHelper 15 { 16 /// <summary> 17 /// 保存同名文件時(shí),進(jìn)行重命名操作. 18 /// 例如文件夾內(nèi)已存在1.txt,則再次保存時(shí)保存為1(1).txt,....1(n).txt 19 /// </summary> 20 /// <param name="strFolderPath">保存的目錄</param> 21 /// <param name="strFileName">文件名</param> 22 /// <returns>新的文件名</returns> 23 public static string ReFileName(string strFolderPath, string strFileName) 24 { 25 //當(dāng)前傳進(jìn)的文件名自帶的索引 26 int intCurrentFileIndex = 0; 27 string strNewName = string.Empty; 28 //用來保存當(dāng)前目錄下的文件的最大索引。 29 int intMaxIndex = 0; 30 //如果文件不存在,直接返回 31 if (!File.Exists(Path.Combine(strFolderPath, strFileName))) 32 { 33 return strFileName; 34 } 35 //根據(jù)傳進(jìn)來的文件名,獲取擴(kuò)展名 36 string strExtention = Path.GetExtension(strFileName); 37 string strFileNameWithoutExtion = Path.GetFileNameWithoutExtension(strFileName); 38 //如果文件名中本身就包括括號,則需要還原原來的文件名 39 string strNameContainsBracketsRegex = "(?<fileName>.+?)" + "([((](?<fileNameIndex>//d+)[))])" + strExtention; 40 Regex regexContain = new Regex(strNameContainsBracketsRegex, RegexOptions.Singleline); 41 if (regexContain.IsMatch(strFileName)) 42 { 43 Match match = regexContain.Match(strFileName); 44 strFileNameWithoutExtion = match.Groups["fileName"].Value; 45 intCurrentFileIndex = Convert.ToInt32(match.Groups["fileNameIndex"].Value); 46 } 47 //根據(jù)傳進(jìn)來的文件名,通過正則匹配,找到類似的文件名,不區(qū)別中英文的括號并且括號及索引可有可無 48 string strRegex = strFileNameWithoutExtion + "([((](?<fileNameIndex>//d+)[))])" + strExtention; 49 Regex regex = new Regex(strRegex, RegexOptions.Singleline); 50 string[] strFileNames = Directory.GetFiles(strFolderPath, "*" + strExtention) 51 .Where(x => regex.IsMatch(x) || x.Contains(strFileNameWithoutExtion)) 52 .ToArray(); 53 if (strFileNames != null && strFileNames.Length > 0) 54 { 55 foreach (string item in strFileNames) 56 { 57 //因?yàn)楂@得的文件路徑數(shù)組中都是匹配成功的路徑,此處不再進(jìn)行判斷是否匹配 58 Match match = regex.Match(item); 59 //獲得索引 60 string strIndex = match.Groups["fileNameIndex"].Value; 61 //如果為空,說明只有類似 1.txt這樣的文件,則返回的文件就是1(1).txt 62 //否則找到最大索引,然后拼接最大索引加一的文件名 63 if (!string.IsNullOrEmpty(strIndex)) 64 { 65 int intIndex = Convert.ToInt32(strIndex); 66 if (intMaxIndex < intIndex) 67 { 68 intMaxIndex = intIndex; 69 } 70 } 71 } 72 //如果目錄中存在的文件索引大于或者等于當(dāng)前傳進(jìn)來的文件的索引則使用新的名稱,否則將返回傳進(jìn)來的文件名稱 73 if (intMaxIndex >= intCurrentFileIndex) 74 { 75 //循環(huán)接收,求出了最大的索引,則新文件的索引就是最大索引加一 76 StringBuilder sb = new StringBuilder(); 77 sb.Append(strFileNameWithoutExtion); 78 sb.Append("("); 79 sb.Append((intMaxIndex + 1).ToString()); 80 sb.Append(")"); 81 sb.Append(strExtention); 82 strNewName = sb.ToString(); 83 } 84 else 85 { 86 strNewName = strFileName; 87 } 88 } 89 else 90 { 91 //如果沒有匹配到相似的文件名結(jié)構(gòu),則說明是一個(gè)新的文件,則不做任何操作 92 strNewName = strFileName; 93 } 94 return strNewName; 95 } 96 /// <summary> 97 /// 保存同名文件夾時(shí),進(jìn)行重命名操作. 98 /// 例如文件夾內(nèi)已存在1的文件夾,則再次保存時(shí)保存為1(1),....1(n) 99 /// </summary>100 /// <param name="strFolderPath">保存的目錄</param>101 /// <param name="strFolderPath">保存的目錄</param>102 /// <returns>新的目錄名</returns>103 public static string ReFolderName(string strFolderPath, string strFolderName)104 {105 //當(dāng)前傳進(jìn)的文件夾自帶的索引106 int intCurrentFolderIndex = 0;107 string strNewName = string.Empty;108 //原始名字109 string strOriginalName = strFolderName;110 //用來保存當(dāng)前目錄下的文件的最大索引。111 int intMaxIndex = 0;112 if (!Directory.Exists(Path.Combine(strFolderPath, strFolderName)))113 {114 return strFolderName;115 }116 //根據(jù)傳進(jìn)來的文件名,通過正則匹配,找到文件夾是否已經(jīng)帶有索引。117 string strRegex = "(?<folderName>.+?)([((](?<folderIndex>//d+)[))])";118 Regex regex = new Regex(strRegex, RegexOptions.Singleline);119 if (regex.IsMatch(strFolderName))120 {121 Match match = regex.Match(strFolderName);122 string strFolderIndex = match.Groups["folderIndex"].Value;123 if (!string.IsNullOrEmpty(strFolderIndex))124 {125 intCurrentFolderIndex = Convert.ToInt32(strFolderIndex);126 strOriginalName = match.Groups["folderName"].Value;127 }128 }129 130 string[] strFolderNames = Directory.GetDirectories(strFolderPath)131 .Where(x => regex.IsMatch(x))132 .Select(x => x.Split(new char[] { '//' })133 .LastOrDefault())134 .ToArray();135 if (strFolderNames != null && strFolderNames.Length > 0)136 {137 foreach (string item in strFolderNames)138 {139 //因?yàn)楂@得的文件路徑數(shù)組中都是匹配成功的路徑,此處不再進(jìn)行判斷是否匹配140 Match match = regex.Match(item);141 //獲得索引142 string strIndex = match.Groups["folderIndex"].Value;143 //如果為空,說明只有類似 1.txt這樣的文件,則返回的文件就是1(1).txt144 //否則找到最大索引,然后拼接最大索引加一的文件名145 if (!string.IsNullOrEmpty(strIndex))146 {147 int intIndex = Convert.ToInt32(strIndex);148 if (intMaxIndex < intIndex)149 {150 intMaxIndex = intIndex;151 }152 }153 }154 //如果目錄中存在的文件索引大于或者等于當(dāng)前傳進(jìn)來的文件的索引則使用新的名稱,否則將返回傳進(jìn)來的文件名稱155 if (intMaxIndex >= intCurrentFolderIndex)156 {157 //循環(huán)接收,求出了最大的索引,則新文件的索引就是最大索引加一158 StringBuilder sb = new StringBuilder();159 sb.Append(strOriginalName);160 sb.Append("(");161 sb.Append((intMaxIndex + 1).ToString());162 sb.Append(")");163 strNewName = sb.ToString();164 }165 else166 {167 strNewName = strFolderName;168 }169 }170 else171 {172 //如果沒有匹配到相似的文件名結(jié)構(gòu),則說明是一個(gè)新的文件,則不做任何操作173 strNewName = strFolderName;174 }175 return strNewName;176 }177 }178 }
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注