1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace MoveFiles.code {
7 //文件或目录的 FullName 或 Name.
8 public enum FileOrDirectoryNameType { FULLNAME, SIMNAME }
9 //文件/目录 的匹配方式.
10 public enum MatchPattern { STARTWITH, ENDWITH, EQUALS, CONTAINS }
11
12 class FileDirLocationOperator {
13
14 //默认处理的是 路径或文件名.
15 public FileOrDirectoryNameType FileOrDirType = FileOrDirectoryNameType.SIMNAME;
16 //默认 文件/目录名包含指定模式的字符串时,处理.
17 public static MatchPattern OpePattern = MatchPattern.EQUALS;
18
19 public string Root { private set; get; }
20
21 /// <summary>
22 /// 构造函数(初始化存储文件系统操作对象集合).
23 /// </summary>
24 /// <param name="root"></param>
25 /// <param name="FileOrDirType"></param>
26 /// <param name="OpePattern"></param>
27 /// <param name="OpeType"></param>
28 public FileDirLocationOperator(string root, FileOrDirectoryNameType FileOrDirType = FileOrDirectoryNameType.SIMNAME, MatchPattern OpePattern = MatchPattern.EQUALS) {
29 if (String.IsNullOrEmpty(root)) throw new ArgumentNullException(root);
30 Root = root;
31 }
32
33 public void RenameDirBySubDir() {
34 string desFullName = "";
35 System.IO.DirectoryInfo desDir = null;
36 //第一层目录.
37 foreach (System.IO.DirectoryInfo dir1st in new System.IO.DirectoryInfo(Root).GetDirectories()) {
38 //第二层目录.
39 string desSimName = "";
40 int endIndex = -1;
41 foreach (System.IO.DirectoryInfo dir2nd in dir1st.GetDirectories()) {
42 endIndex = dir2nd.Name.LastIndexOf("_CSharp");
43 if (endIndex != -1) {
44 desSimName = dir2nd.Name.Substring(0, endIndex);
45 break;
46 }
47 } //foreach:dir2nd
48
49 if (string.IsNullOrEmpty(desSimName)) continue;
50 desFullName = Root + "\\" + desSimName;
51 desDir = new System.IO.DirectoryInfo(desFullName);
52 if (!desDir.Exists) {
53 desDir.Create();
54 dir1st.MoveTo(desDir.FullName);
55 }
56 } //foreach:dir1st
57 }
58
59 /// <summary>
60 /// 将指定目录下的所有文件和目录都移到上一目录,并删除被移空的当前指定的目录.
61 /// </summary>
62 /// <param name="dir">指定的目录.</param>
63 public void SubFileSysToParent(System.IO.DirectoryInfo dir) {
64 foreach (System.IO.FileSystemInfo sub in dir.GetFileSystemInfos()) {
65 Move(sub, dir.Parent.FullName + "\\" + sub.Name);
66 }
67 //删除已被移空的目录.
68 if (dir.GetFileSystemInfos().Length == 0)
69 dir.Delete();
70 }
71
72 /// <summary>
73 /// 按文件的名称在当前目录创建对应的目录,并将文件移进去.例如,在当前目录中有个文件为"fileName.txt",
74 /// 则在当前目录下创建目录"fileName",并将"fileName.txt"移进"fileName"中.
75 /// </summary>
76 /// <param name="filter">文件的后缀名.</param>
77 public void MoveFilesByRandomCreateDir(string filter) {
78 string desFullName = ""; //目标文件的名称.
79 System.IO.DirectoryInfo dirDes = null;
80 foreach (System.IO.FileInfo fInfo in new System.IO.DirectoryInfo(Root).GetFiles(filter)) {
81 desFullName = string.Concat(fInfo.DirectoryName, "\\", System.IO.Path.GetFileNameWithoutExtension(fInfo.Name));
82 dirDes = new System.IO.DirectoryInfo(desFullName);
83 //对于不存在的目录,需要创建.
84 if (!dirDes.Exists) {
85 dirDes.Create();
86 }
87 fInfo.MoveTo(string.Concat(dirDes.FullName, "\\", fInfo.Name));
88 }
89 }
90
91 /// <summary>
92 /// 判断是否匹配.
93 /// </summary>
94 /// <param name="dirOrFileName">源文件或目录名.</param>
95 /// <param name="namePattern">待匹配的字符串.</param>
96 /// <param name="ignoreCase">是否忽略大小写.</param>
97 /// <returns></returns>
98 public static bool Match(string dirOrFileName, string namePattern, bool ignoreCase) {
99 switch (OpePattern) {
100 case MatchPattern.CONTAINS:
101 return dirOrFileName.Contains(namePattern);
102 case MatchPattern.EQUALS:
103 if (ignoreCase)
104 return dirOrFileName.Equals(namePattern, StringComparison.CurrentCultureIgnoreCase);
105 else
106 return dirOrFileName.Equals(namePattern, StringComparison.CurrentCulture);
107 case MatchPattern.STARTWITH:
108 return dirOrFileName.StartsWith(namePattern);
109 case MatchPattern.ENDWITH:
110 return dirOrFileName.EndsWith(namePattern);
111 default:
112 throw new ArgumentNullException("MatchPattern:OperationPattern");
113 }
114 }
115
116 /// <summary>
117 /// 移动文件或目录.
118 /// </summary>
119 /// <param name="fSysSrc">源文件或目录.</param>
120 /// <param name="desDirName">目标文件或目录名.</param>
121 private void Move(System.IO.FileSystemInfo fSysSrc, string desDirName) {
122 //文件.
123 if (fSysSrc is System.IO.FileInfo) {
124 System.IO.FileInfo f = (System.IO.FileInfo)fSysSrc;
125 f.MoveTo(desDirName);
126 }
127 //目录.
128 else if (fSysSrc is System.IO.DirectoryInfo) {
129 System.IO.DirectoryInfo d = (System.IO.DirectoryInfo)fSysSrc;
130 d.MoveTo(desDirName);
131 }
132 else throw new ArgumentNullException(fSysSrc.FullName);
133 }
134 }
135 }