using System; using System.Data; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Net; using QMAPP.FJC.Entity.FileCopy; using QMAPP.FJC.BLL.FileCopy; namespace AutoFileCopyNet { /// /// 功能描述:实现文件目录的文件复制功能, /// 作者:sunguoqiang /// 日期:2012-11-20 /// public class DirHandler { /// /// 复制文件,未做出错处理 /// /// 源目录 /// 目标目录 /// 文件夹名的查找关键字 /// 查找方式,顶级目录或所有目录 /// 文件重命名时使用的前缀,如果为空,相当于使用原名称 public static void CopyDir(String fromDir, String toDir, String keyWords, SearchOption searchOption, String prefixFileName, String EQUIPMENT_Code, String EQUIPMENT_Type_Code, String localDir, string EQUIPMENT_KEY) { if (!System.IO.Directory.Exists(fromDir)) { return; } FileCopyRecordBLL bll = new FileCopyRecordBLL(); FileCopyRecord record = new FileCopyRecord(); DirectoryInfo Dir = new DirectoryInfo(fromDir); try { foreach (DirectoryInfo d in Dir.GetDirectories()) //查找所有子目录 { string filename = d.ToString().Substring(0, 8); //获取日期 //文件日期小于当前日期的才拷贝(-1) int i = filename.CompareTo(keyWords); //如果不是当日 if (filename != keyWords && i < 0) { //从数据库读取子目录信息 List list = bll.GetAllList(new FileCopyRecord { RECORD_KEYWORDS = d.ToString(), EQUIPMENT_INFO_KEY = EQUIPMENT_KEY, FILE_HOSTNAME = Dns.GetHostName()}); //判断数据库中是否有记录,如果没有则插入数据 if (list.Count < 1) { CopyDir(d.FullName.ToString() + Path.DirectorySeparatorChar, toDir +Path.DirectorySeparatorChar+ d.ToString () + Path.DirectorySeparatorChar, prefixFileName); #region "把文件复制记录写入数据库" record.RECORD_KEY = Guid.NewGuid().ToString(); record.RECORD_EQUIPMENT_CODE = EQUIPMENT_Code; record.RECORD_EQUIPMENT_TYPE_CODE = EQUIPMENT_Type_Code; record.RECORD_EQUIPMENT_DIRECTORY = localDir; record.RECORD_KEYWORDS = d.ToString(); record.FILE_HOSTNAME = Dns.GetHostName(); record.FILE_LASTWRITETIME = d.LastWriteTime;//.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo); ; record.RECORD_COPY_DATETIME = DateTime.Now; record.EQUIPMENT_INFO_KEY = EQUIPMENT_KEY; bll.Insert(record); #endregion } else if (!Directory.Exists(@toDir+"\\"+d.ToString() )) { CopyDir(d.FullName.ToString() + Path.DirectorySeparatorChar, toDir +Path.DirectorySeparatorChar+d.ToString() + Path.DirectorySeparatorChar, prefixFileName); } } } } catch (Exception ex) { LogFileAccess.WriteLogFile("复制文件失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } /// /// 复制文件,未做出错处理 /// /// 源目录 /// 目标目录 /// 文件重命名时使用的前缀,如果为空,相当于使用原名称 /// public static void CopyDir(String fromDir, String toDir, String prefixFileName) { if (!System.IO.Directory.Exists(fromDir)) { return; } if (toDir[toDir.Length - 1] != System.IO.Path.DirectorySeparatorChar) { toDir += System.IO.Path.DirectorySeparatorChar; } if (!System.IO.Directory.Exists(toDir)) { System.IO.Directory.CreateDirectory(toDir); } DirectoryInfo Dir = new DirectoryInfo(fromDir); try { String tempDir = String.Empty; foreach (DirectoryInfo d in Dir.GetDirectories())//查找子目录 { CopyDir(d.FullName.ToString() + Path.DirectorySeparatorChar, toDir + d.Name + Path.DirectorySeparatorChar, prefixFileName); } foreach (FileInfo f in Dir.GetFiles()) //查找文件 { File.Copy(f.FullName, toDir + prefixFileName + f.Name, true); } } catch (Exception ex) { LogFileAccess.WriteLogFile("复制文件失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } /// /// 复制文件,未做出错处理 /// /// 源目录 /// 目标目录 /// 文件夹名的查找关键字 /// 查找方式,顶级目录或所有目录 /// 文件重命名时使用的前缀,如果为空,相当于使用原名称 /// 文件的修改时间限制,只复制大于等于lastWriteTime的文件 public static void CopyDir(String fromDir, String toDir, String keyWords, SearchOption searchOption, String prefixFileName, DateTime lastWriteTime) { if (!System.IO.Directory.Exists(fromDir)) { return; } DirectoryInfo Dir = new DirectoryInfo(fromDir); try { foreach (DirectoryInfo d in Dir.GetDirectories(keyWords, searchOption))//查找子目录 { CopyDir(d.FullName.ToString() + Path.DirectorySeparatorChar, toDir + d.FullName.Substring(fromDir.Length) + Path.DirectorySeparatorChar, prefixFileName, lastWriteTime); } } catch (Exception ex) { LogFileAccess.WriteLogFile("复制文件失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } /// /// 复制文件,未做出错处理 /// /// 源目录 /// 目标目录 /// 文件重命名时使用的前缀,如果为空,相当于使用原名称 /// 文件的修改时间限制,只复制大于等于lastWriteTime的文件 public static void CopyDir(String fromDir, String toDir, String prefixFileName, DateTime lastWriteTime) { if (!System.IO.Directory.Exists(fromDir)) { return; } if (toDir[toDir.Length - 1] != System.IO.Path.DirectorySeparatorChar) { toDir += System.IO.Path.DirectorySeparatorChar; } if (!System.IO.Directory.Exists(toDir)) { System.IO.Directory.CreateDirectory(toDir); } DirectoryInfo Dir = new DirectoryInfo(fromDir); try { String tempDir = String.Empty; foreach (DirectoryInfo d in Dir.GetDirectories())//查找子目录 { CopyDir(d.FullName.ToString() + Path.DirectorySeparatorChar, toDir + d.Name + Path.DirectorySeparatorChar, prefixFileName, lastWriteTime); } foreach (FileInfo f in Dir.GetFiles()) //查找文件 { if (f.LastWriteTime >= lastWriteTime) { File.Copy(f.FullName, toDir + prefixFileName + f.Name, true); } } } catch (Exception e) { throw new Exception(e.Message); } } /// /// 获取新文件名,格式为yyyyMMddHHmmss+4位随机数+"_" /// /// 文件名 public static String GetNewPrefix() { Random r = new Random(); return DateTime.Now.ToString("yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo) + r.Next(1000, 9999) + "_"; } /// /// 复制远红外文件,未做出错处理 /// /// 源目录 /// 目标目录 public static void CopyDir(String fromDir, String toDir, String EQUIPMENT_Code, String EQUIPMENT_Type_Code, string EQUIPMENT_INFO_KEY) { FileCopyRecordBLL bll = new FileCopyRecordBLL(); FileCopyRecord record = new FileCopyRecord(); DateTime lastWriteTime = DateTime.Now;//当前日期 if (!System.IO.Directory.Exists(fromDir)) { LogFileAccess.WriteLogFile("复制文件保存文件信息失败" + fromDir + "没有找到---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); return; } if (toDir[toDir.Length - 1] != System.IO.Path.DirectorySeparatorChar) { toDir += System.IO.Path.DirectorySeparatorChar; } if (!System.IO.Directory.Exists(toDir)) { System.IO.Directory.CreateDirectory(toDir); } DirectoryInfo Dir = new DirectoryInfo(fromDir); try { String tempDir = String.Empty; foreach (DirectoryInfo d in Dir.GetDirectories())//查找子目录 { CopyDir(d.FullName.ToString() + Path.DirectorySeparatorChar, toDir + d.Name + Path.DirectorySeparatorChar, EQUIPMENT_Code, EQUIPMENT_Type_Code, EQUIPMENT_INFO_KEY); } foreach (FileInfo f in Dir.GetFiles()) //查找文件 { string hostname = Dns.GetHostName(); string lastwritetime = f.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo); //查询该文件是否复制过,如果没有复制过,则开始复制该文件 List list = bll.GetAllList(new FileCopyRecord { RECORD_FILENAME = f.Name, EQUIPMENT_INFO_KEY = EQUIPMENT_INFO_KEY, FILE_HOSTNAME = hostname }); string templastwrit = ""; if (list.Count > 0) { record = list[0]; templastwrit = list[0].FILE_LASTWRITETIME.ToString(); } if (list.Count <= 0) { File.Copy(f.FullName, toDir + f.Name, true); #region "把文件复制记录写入数据库" record.RECORD_KEY = Guid.NewGuid().ToString(); record.RECORD_EQUIPMENT_CODE = EQUIPMENT_Code; record.RECORD_EQUIPMENT_TYPE_CODE = EQUIPMENT_Type_Code; record.RECORD_EQUIPMENT_DIRECTORY = toDir; record.RECORD_KEYWORDS = EQUIPMENT_Code; record.RECORD_COPY_DATETIME = DateTime.Now; record.RECORD_READFLAG = "0"; record.RECORD_FILENAME = f.Name; record.EQUIPMENT_INFO_KEY = EQUIPMENT_INFO_KEY; //record.FILE_LASTWRITETIME = lastwritetime; record.FILE_HOSTNAME = hostname; bll.Insert(record); #endregion } else if (lastwritetime != templastwrit) { File.Copy(f.FullName, toDir + f.Name, true);//复制后覆盖原文件 #region "把修改数据库中文件复制时间" record.RECORD_COPY_DATETIME = DateTime.Now; //record.FILE_LASTWRITETIME = lastwritetime; record.RECORD_FILENAME = f.Name; record.FILE_HOSTNAME = Dns.GetHostName(); bll.Update(record); #endregion } else if (!File.Exists(@toDir + f.Name)) { File.Copy(f.FullName, toDir + f.Name, true); } } } catch(Exception ex) { LogFileAccess.WriteLogFile("复制文件保存文件信息失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } /// /// 复制远红外文件,未做出错处理 /// /// 源目录 /// 目标目录 public static void UpdateDir(List files, String toDir, String EQUIPMENT_Code, String EQUIPMENT_Type_Code, string EQUIPMENT_INFO_KEY) { FileCopyRecordBLL bll = new FileCopyRecordBLL(); FileCopyRecord record = new FileCopyRecord(); DateTime lastWriteTime = DateTime.Now;//当前日期 try { String tempDir = String.Empty; string hostname = Dns.GetHostName(); foreach (var item in files) { string lastwritetime = item.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo); //查询该文件是否复制过,如果没有复制过,则开始复制该文件 List list = bll.GetAllList(new FileCopyRecord { RECORD_FILENAME = item.Name, EQUIPMENT_INFO_KEY = EQUIPMENT_INFO_KEY, FILE_HOSTNAME = hostname }); string templastwrit = ""; if (list.Count > 0) { record = list[0]; templastwrit = list[0].FILE_LASTWRITETIME.ToString(); } if (list.Count <= 0) { #region "把文件复制记录写入数据库" record.RECORD_KEY = Guid.NewGuid().ToString(); record.RECORD_EQUIPMENT_CODE = EQUIPMENT_Code; record.RECORD_EQUIPMENT_TYPE_CODE = EQUIPMENT_Type_Code; record.RECORD_EQUIPMENT_DIRECTORY = toDir; record.RECORD_KEYWORDS = EQUIPMENT_Code; record.RECORD_COPY_DATETIME = DateTime.Now; record.RECORD_READFLAG = "0"; record.RECORD_FILENAME = item.Name; record.EQUIPMENT_INFO_KEY = EQUIPMENT_INFO_KEY; //record.FILE_LASTWRITETIME = lastwritetime; record.FILE_HOSTNAME = hostname; bll.Insert(record); #endregion } else if (lastwritetime != templastwrit) { #region "把修改数据库中文件复制时间" record.RECORD_COPY_DATETIME = DateTime.Now; //record.FILE_LASTWRITETIME = lastwritetime; record.RECORD_FILENAME =item.Name; record.FILE_HOSTNAME = Dns.GetHostName(); bll.Update(record); #endregion } } } catch (Exception ex) { LogFileAccess.WriteLogFile("复制文件保存文件信息失败" + ex.Message + ex.Source + "---" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } } }