FileProcessor.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Text.RegularExpressions;
  7. namespace AVSORTER
  8. {
  9. public class FileProcessor
  10. {
  11. #region ctor
  12. public static FileProcessor GetInstance()
  13. {
  14. if (f == null)
  15. {
  16. f = new FileProcessor();
  17. }
  18. else
  19. {
  20. //nothing
  21. }
  22. return f;
  23. }
  24. private static FileProcessor f;
  25. public FileProcessor()
  26. {
  27. this.DestPath = db.GetDestPath();
  28. this.SubPath = db.GetSubPath();
  29. }
  30. public void LoadPath()
  31. {
  32. this.DestPath = db.GetDestPath();
  33. this.SubPath = db.GetSubPath();
  34. }
  35. #endregion
  36. #region 属性字段
  37. DB.AVDB db = new DB.AVDB();
  38. StringBuilder _sblog = new StringBuilder();
  39. public List<string> Files
  40. {
  41. get
  42. {
  43. return this.list;
  44. }
  45. }
  46. List<string> list = new List<string>();
  47. /// <summary>
  48. /// 目标文件夹
  49. /// </summary>
  50. public string DestPath { get; set; }
  51. /// <summary>
  52. /// 自动显示文件移动日志
  53. /// </summary>
  54. public bool ShowLog { get; set; }
  55. /// <summary>
  56. /// 目标文件夹的自定义子文件夹
  57. /// </summary>
  58. public string SubPath { get; set; }
  59. /// <summary>
  60. /// 文件扩展名过滤
  61. /// </summary>
  62. public string Pattern
  63. {
  64. get {
  65. return this._pattern;
  66. }
  67. set
  68. {
  69. this._pattern = value;
  70. }
  71. }
  72. string _pattern = @"\.mp4|\.mov|\.avi|\.wmv|\.iso|\.rm|\.rmvb|\.mkv";
  73. #endregion
  74. void less(List<string> l)
  75. {
  76. l.RemoveAll(j => !Regex.IsMatch(Path.GetExtension(j),Pattern, RegexOptions.IgnoreCase));
  77. }
  78. string _getFilePathName(Movie movie,string sourceFile)
  79. {
  80. if (SubPath!=null)
  81. {
  82. var a = SubPath.Replace("演员", movie.Actor.Count == 0 ? "无名氏" : Tools.ListToString(movie.Actor));
  83. a = a.Replace("番号", movie.AVCode);
  84. a = a.Replace("厂商", movie.Maker == "" ? "未知厂商" : movie.Maker);
  85. a = a.Replace("制造商", movie.Producer == "" ? "未知制造商" : movie.Producer);
  86. a = a.Replace("标题", movie.Title == "" ? "未知标题" : movie.Title);
  87. a = a.Replace("标签", movie.Lable == "" ? "无标签" : movie.Lable);
  88. return Path.Combine(DestPath, a, movie.AVCode + Path.GetExtension(sourceFile));
  89. }
  90. else
  91. {
  92. return Path.Combine(DestPath, movie.AVCode, Path.GetFileName(movie.AVCode));
  93. }
  94. }
  95. public string GetDestNamePreview(Movie m,string sourceFile) {
  96. return this._getFilePathName(m, sourceFile);
  97. }
  98. public void MakeMove(Movie m, string sourceFile)
  99. {
  100. string dest = _getFilePathName(m, sourceFile);
  101. try
  102. {
  103. MoveFile(sourceFile, dest);
  104. _sblog.AppendLine("复制" + sourceFile + "\r\n 至 " + dest);
  105. if (m.CoverFile != null)
  106. {
  107. CopyFile(m.CoverFile, Path.Combine(Path.GetDirectoryName(dest), Path.GetFileName(m.CoverFile)));
  108. }
  109. var xiangduiPath = dest.Substring(this.DestPath.Length + 1);
  110. db.AddNewAV(m, xiangduiPath, true);
  111. }
  112. catch (System.Data.OleDb.OleDbException err)
  113. {
  114. _sblog.AppendLine("===ERROR=== 数据库写入错误:" + err.Message + " 处理:" + sourceFile);
  115. }
  116. catch (Exception err)
  117. {
  118. _sblog.AppendLine("===ERROR===" + "文件" + sourceFile + "复制到" + dest + "未成功!");
  119. }
  120. //Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(sourceFile, dest, Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
  121. //Microsoft.VisualBasic.FileIO.FileSystem.CopyFile(m.CoverFile, Path.Combine(Path.GetDirectoryName(dest),Path.GetFileName(m.CoverFile)), Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
  122. }
  123. public void MakeDataBase(Movie m, string sourceFile)
  124. {
  125. string dest = _getFilePathName(m, sourceFile);
  126. try
  127. {
  128. //MoveFile(sourceFile, dest);
  129. //_sblog.AppendLine("复制" + sourceFile + "\r\n 至 " + dest);
  130. //if (m.CoverFile != null)
  131. //{
  132. // CopyFile(m.CoverFile, Path.Combine(Path.GetDirectoryName(dest), Path.GetFileName(m.CoverFile)));
  133. //}
  134. m.CoverFile = m.AVCode + ".jpg";
  135. var xiangduiPath = dest.Substring(this.DestPath.Length + 1);
  136. db.AddNewAV(m, xiangduiPath, true);
  137. }
  138. catch (System.Data.OleDb.OleDbException err)
  139. {
  140. _sblog.AppendLine("===ERROR=== 数据库写入错误:" + err.Message + " 处理:" + sourceFile);
  141. }
  142. catch (Exception err)
  143. {
  144. _sblog.AppendLine("===ERROR===" + "文件" + sourceFile + "复制到" + dest + "未成功!");
  145. }
  146. //Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(sourceFile, dest, Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
  147. //Microsoft.VisualBasic.FileIO.FileSystem.CopyFile(m.CoverFile, Path.Combine(Path.GetDirectoryName(dest),Path.GetFileName(m.CoverFile)), Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
  148. }
  149. /// <summary>
  150. /// 添加文件列表
  151. /// </summary>
  152. /// <param name="startDirectory"></param>
  153. public void AddDirectory(string startDirectory)
  154. {
  155. //是文件
  156. if (File.Exists(startDirectory))
  157. {
  158. List<string> l = new List<string>();
  159. l.Add(startDirectory);
  160. less(l);
  161. this.list.AddRange(l);
  162. this.list = this.list.Distinct<string>().ToList<string>();
  163. }
  164. else//是目录
  165. {
  166. var l = Directory.GetFileSystemEntries(startDirectory, "*.*", SearchOption.AllDirectories).ToList<string>();
  167. less(l);
  168. this.list.AddRange(l);
  169. this.list = this.list.Distinct<string>().ToList<string>();
  170. }
  171. }
  172. /// <summary>
  173. /// 写日志
  174. /// </summary>
  175. public void WriteLog()
  176. {
  177. string log = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt");
  178. File.WriteAllText(log, _sblog.ToString(), Encoding.Default);
  179. if (ShowLog)
  180. {
  181. System.Diagnostics.Process.Start(log);
  182. }
  183. }
  184. void CopyFile(string sourceFile,string destFile)
  185. {
  186. //char[] invalidFileChars = Path.GetInvalidFileNameChars();
  187. //foreach (char cr in invalidFileChars)
  188. //{
  189. // destFile = destFile.Replace(cr.ToString(), "");
  190. //}
  191. if (!Directory.Exists(Path.GetDirectoryName(destFile)))
  192. {
  193. Directory.CreateDirectory(Path.GetDirectoryName(destFile));
  194. }
  195. int c = 0;
  196. while (Microsoft.VisualBasic.FileIO.FileSystem.FileExists(destFile))
  197. {
  198. destFile = Path.Combine(Path.GetDirectoryName(destFile), Path.GetFileNameWithoutExtension(destFile) + "_" + (++c).ToString() + Path.GetExtension(destFile));
  199. }
  200. Microsoft.VisualBasic.FileIO.FileSystem.CopyFile(sourceFile, destFile, Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
  201. }
  202. void MoveFile(string sourceFile, string destFile)
  203. {
  204. //char[] invalidFileChars = Path.GetInvalidFileNameChars();
  205. //foreach (char cr in invalidFileChars)
  206. //{
  207. // destFile = destFile.Replace(cr.ToString(), "");
  208. //}
  209. if (sourceFile==destFile)
  210. {
  211. return;
  212. }
  213. if (!Directory.Exists(Path.GetDirectoryName(destFile)))
  214. {
  215. try
  216. {
  217. Directory.CreateDirectory(Path.GetDirectoryName(destFile));
  218. }
  219. catch (Exception)
  220. {
  221. throw;
  222. }
  223. }
  224. int c = 0;
  225. while (Microsoft.VisualBasic.FileIO.FileSystem.FileExists(destFile))
  226. {
  227. destFile = Path.Combine(Path.GetDirectoryName(destFile), Path.GetFileNameWithoutExtension(destFile) + "_" + (++c).ToString() + Path.GetExtension(destFile));
  228. }
  229. Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(sourceFile, destFile, Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
  230. }
  231. }
  232. }