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 }
时间: 2024-10-10 14:05:14