C#实现本地复制文件或者文件夹建立副本取名功能
本地复制文件或者文件夹建立副本取名功能,完全模仿Windows下复制文件和文件夹的功能,直接调用方法,返回复制后的新对象名称。
View Code
1 /// <summary>
2 /// 检查要为复制的文件或者文件夹重命名的名称
3 /// </summary>
4 /// <param name="destFileName">复制的源文件的名称</param>
5 /// <param name="isDirectory">True是目录\False是文件</param>
6 /// <returns>新文件或者文件夹的名称</returns>
7 internal static string GetCopyObjectName(string sourceName, bool isDirectory)
8 {
9 try
10 {
11 //要返回的对象名称
12 string ReturnFileName = string.Empty;
13 /*根据源文件名称复制出来的已经存在的副本文件名称的序号集合
14 * eg. 源文件 :Index.html 复制后会有 Index -副本.html、Index -副本 (2).html、Index -副本 (3).html...;
15 * 这里取序号 2、3填入集合
16 */
17 ArrayList FileName = new ArrayList();
18 //同级目录下所有相同类型对象的名称
19 string[] AllObjectName = isDirectory
20 ? Directory.GetDirectories(Path.GetDirectoryName(sourceName), "*", SearchOption.TopDirectoryOnly) //目录
21 : Directory.GetFiles(Path.GetDirectoryName(sourceName), string.Format("*{0}", Path.GetExtension(sourceName)), SearchOption.TopDirectoryOnly); //文件
22 //复制源的对象名称
23 string SourceFileName = string.Format("{0} -副本", Path.GetFileNameWithoutExtension(sourceName));
24 //同一目录中已经存在同种类型的对象的名称
25 string ExistFileName = string.Empty;
26 //遍历同种源复制出来的对角名称个数名,取其序号
27 foreach (string var in AllObjectName)
28 {
29 //已经存在的无后缀的文件名
30 ExistFileName = Path.GetFileNameWithoutExtension(var);
31 //判断是否存在源文件的副本文件,存在则把所有副本的序号填充到集合
32 if (ExistFileName.Contains(SourceFileName))
33 {
34 //抽取新建文件名中的序号
35 string tmpstr = ExistFileName.Replace(SourceFileName, string.Empty).ToString().Replace("(", string.Empty).Replace(")", string.Empty).Trim();
36 if (tmpstr.Equals(string.Empty))
37 {
38 FileName.Add(1);
39 continue;
40 }
41 int novalue;
42 //把序号转换成数值型
43 if (int.TryParse(tmpstr, out novalue))
44 {
45 FileName.Add(novalue);
46 continue;
47 }
48 }
49 }
50 //给集合按数字序号从小到大排序
51 FileName.Sort();
52
53 string usevalue = string.Empty;
54 for (int i = 0; i < FileName.Count; i++)
55 {
56 int objectNo = i + 1; //索引处对象名称序号应该对应的序号值
57
58 //查找数字序列中是否不完整,
59 if (!FileName[i].ToString().Equals(objectNo.ToString()))
60 { //如果不存在则选择这个值
61 usevalue = objectNo.Equals(1) ? string.Empty : objectNo.ToString();
62 break;
63 }
64 else
65 { //如果存在,则加1后,继续循环
66 usevalue = (objectNo + 1).ToString();
67 continue;
68 }
69 }
70 if (!usevalue.Equals(string.Empty)) //如果不为空给序号加上括号
71 usevalue = "(" + usevalue + ")";
72 //组合文件名称
73 ReturnFileName = Path.Combine(Path.GetDirectoryName(sourceName), string.Format("{0} {1}", SourceFileName, usevalue)).Trim();
74 if (!isDirectory) //如果不是目录,加上对象的后缀名
75 ReturnFileName += Path.GetExtension(sourceName);
76 //返回文件名称
77 return ReturnFileName.Trim();
78 }
79 catch (Exception ex)
80 {
81 throw new Exception(ex.Message);
82 }
83 }