批量给文件或者文件夹重命名
在给文件重命名的时候如果当前文件夹中已有该名字,重命名就会失败,如果一个文件夹中有很多文件,现在需要给这些文件重命名,这些名字其中有很多已经包含了,也有一些是新的。手动去重命名是非常困难的,需要把当前文件夹中所有文件一个一个复制到一个新文件夹,一个一个去重新命名,全部弄完了,把源文件夹清空,再把已经重命名的文件重新复制到原来的文件夹。手动可以完成,但是非常麻烦,如果程序也这样去做就得让程序去开辟一个缓存文件夹,一个一个copy文件到缓存文件夹重命名,全部完成把源文件夹清空,再把缓存文件夹中文件copy到源文件夹,结束再删除缓存文件夹,效率低下且麻烦。下面提供一个思路。文件不能重命名是因为与已有文件名相同而冲突,这样我们可以在重命名之前,找到已有的具有相同文件名的文件把它名字改掉再重命名我们要的文件。举例有文件A,B存在于某一个文件夹,现在需要把A文件取名为B,把B文件取名为A,操作方法为:将B文件重命名为tempB,这时候该文件夹有两个文件为A和tempB,再将A重命名为B,这时候文件夹包含B,tempB,再将tempB重命名为A,这时候便将文件名交换了,如同数组里边交换数据的远离。对于含有大量的文件的文件夹也类似于数组交换排序的方式去重命名,两两交换,直到最后一个就把所有文件按照预期重命名了,下面提供一个方法:
1 /// <summary> 2 /// 文件或文件夹批量重命名 3 /// </summary> 4 /// <param name="oldPath">当前文件名数组</param> 5 /// <param name="newPath">命名后的文件名数组</param> 6 private void ReNameFileQuantity(string[] oldPath, string[] newPath) 7 { 8 for (int i = 0; i < oldPath.Length; i++) 9 { 10 string oldName = oldPath[i]; 11 string newName = newPath[i]; 12 string st = System.IO.Path.GetExtension(oldName); 13 if (oldPath.Contains(newName)) 14 { 15 int index = 0; 16 for (int k = 0; k < oldPath.Length; k++) 17 { 18 if (oldPath[k] == newName) 19 { 20 index = k; 21 } 22 } 23 if (index != i) 24 { 25 oldPath[i] = newName; 26 oldPath[index] = oldName; 27 if (st == string.Empty)//文件夹目录重命名 28 { 29 st = System.IO.Path.GetDirectoryName(newName) + "\\#CacheImage_JimmyBright#"; 30 Directory.Move(newName, st); 31 Directory.Move(oldName, newName); 32 Directory.Move(st, oldName); 33 } 34 else//文件重命名 35 { 36 st = System.IO.Path.GetDirectoryName(newName) + "\\#CacheImage_JimmyBright#" + System.IO.Path.GetExtension(oldName); 37 File.Move(newName, st); 38 File.Move(oldName, newName); 39 File.Move(st, oldName); 40 } 41 } 42 } 43 else 44 { 45 if (st == string.Empty)//文件夹目录重命名 46 { 47 Directory.Move(oldName, newName); 48 } 49 else 50 { 51 File.Move(oldName, newName); 52 } 53 } 54 } 55 }
例如某个文件夹拥有如下一些图片:
每个图片的名字和对应的上面的编号不一样,现在就可以通过上面的方法把已有的文件名作为数组1.jpg,2.jpg,3.jpg,4.jpg,5.jpg,6.jpg,7.jpg,8.jpg,9.jpg,10.jpg
需要重新命名的顺序为:4.jpg,5.jpg,10.jpg,6.jpg,2.jpg,8.jpg,1.jpg,7.jpg,9.jpg,3.jpg
传入这两个数组结果为: