using DataLoader.Model; using Npgsql; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data.Common; using System.IO; using System.Linq; using System.Reflection; using System.Threading.Tasks; using System.Windows.Forms; namespace DataLoader.CS { public class Importor { private static List Exclusions = new List() { "jp2.aux.xml", ".midx", ".strmi", ".rrd", ".img.aux.xml", ".hdr", ".img.enp", ".img.xml", ".tfw", ".tif.ovr", ".tif.aux.xml", ".tif.enp", ".tif.xml", ".prj", ".shx", ".dbf", ".cpg" //, ".prj" }; private static PostgreHelper _ph = null; public static PostgreHelper Helper { get { if (_ph == null) _ph = new PostgreHelper(DbEnum.langfang); return _ph; } } private static readonly string insertMeta = "insert into lf.sys_meta (eventid, metaid, dirid, depid, verid, name, type, guid, path, sizes, tab, rows, create_user, create_time) values (@eventid, @metaid, @dirid, @depid, @verid, @name, @type, @guid, @path, @sizes, @tab, @rows, @create_user, now()) returning id"; public static string GetFilePathByGuid(string guid) { string sql = "select path from lf.sys_meta where guid = @guid limit 1"; DbParameter dp = new NpgsqlParameter("@guid", guid); object obj = Helper.GetScalar(sql, dp); return obj == null ? null : obj.ToString(); } public static bool IsFileExists(string guid) { string sql = "select count(*) from lf.sys_meta where guid = @guid"; DbParameter dp = new NpgsqlParameter("@guid", guid); object obj = Helper.GetScalar(sql, dp); return obj != null && Convert.ToInt32(obj) > 0; } public static int InsertMeta(SysMeta meta) { List list = Tool.GetParams(insertMeta, meta); object obj = Helper.GetScalar(insertMeta, list.ToArray()); return obj == null ? 0 : Convert.ToInt32(obj); } public static void GetFiles(ObservableCollection viewDatas, string source) { string[] files = Directory.GetFiles(source); for (int i = 0, c = files.Length; i < c; i++) { ViewData vd = new ViewData(); vd.ID = i + 1; vd.FilePath = files[i]; vd.Ext = System.IO.Path.GetExtension(files[i]); vd.Status = "准备"; viewDatas.Add(vd); SetSysMeta(vd); } } private static void SetSysMeta(ViewData vd) { FileInfo fi = new FileInfo(vd.FilePath); vd.Meta = new SysMeta(); vd.Meta.name = fi.Name; vd.Meta.dirid = Tool.DirId; vd.Meta.depid = 1; vd.Meta.verid = 0; vd.Meta.type = fi.Extension.ToLower().Replace(".", ""); vd.Meta.sizes = Tool.SizeToMb(fi.Length); vd.Meta.create_user = Tool.UserId; } public static void ImportFiles(ObservableCollection viewDatas, string target) { Parallel.ForEach(viewDatas, (vd, ParallelLoopState) => { try { vd.Status = "生成MD5码..."; string guid = MD5Helper.GetMD5Hash(vd.FilePath); if (!Exclusions.Contains(vd.Ext) && IsFileExists(guid)) { vd.Status = "已存在!"; return; } vd.Status = "插入数据库..."; int start = GetSubPath(target, 1); SysMeta mf = GetMetaFile(vd, start, guid); int metaId = InsertMeta(mf); if (metaId == 0) { vd.Status = "元数据出错!"; return; } vd.Status = "复制文件..."; CopyFile(vd.FilePath, Path.Combine(target, mf.path)); vd.Status = "完成。"; } catch (Exception ex) { LogOut.Error(ex.Message + "\r\n" + ex.StackTrace); vd.Status = "失败!"; } }); } public static void ImportFiles2(ObservableCollection viewDatas, string target) { int start = 1; foreach (ViewData vd in viewDatas) { try { vd.Status = "生成MD5码..."; string guid = MD5Helper.GetMD5Hash(vd.FilePath); if (IsFileExists(guid)) { vd.Status = "已存在!"; continue; } vd.Status = "插入数据库..."; start = GetSubPath(target, start); SysMeta mf = GetMetaFile(vd, start, guid); int metaId = InsertMeta(mf); if (metaId == 0) { vd.Status = "元数据出错!"; continue; } vd.Status = "复制文件..."; CopyFile(vd.FilePath, Path.Combine(target, mf.path)); vd.Status = "完成。"; } catch (Exception ex) { LogOut.Error(ex.Message + "\r\n" + ex.StackTrace); vd.Status = "失败!"; } } } private static int GetSubPath(string target, int start = 1) { while (true) { string path = Path.Combine(target, start.ToString()); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); return start; } string[] files = Directory.GetFiles(path); if (files.Length < 2001) { return start; } start++; } } private static SysMeta GetMetaFile(ViewData vd, int subPath, string guid) { SysMeta mf = new SysMeta(); mf.eventid = Guid.NewGuid().ToString(); mf.metaid = 0; mf.dirid = vd.Meta.dirid; mf.depid = vd.Meta.depid; mf.verid = vd.Meta.verid; mf.name = vd.Meta.name; mf.type = vd.Meta.type; mf.guid = guid; mf.path = subPath + "\\" + mf.name; mf.sizes = vd.Meta.sizes; mf.tab = null; mf.rows = 0; mf.create_user = vd.Meta.create_user; return mf; } private static void CopyFile(string source, string target) { if (File.Exists(source)) { File.Copy(source, target, true); } } } }