using DataLoader.Model; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Documents; namespace DataLoader.CS { public class Importor { #region 加载 /// /// 获取文件 /// public static void GetFiles(ObservableCollection viewDatas, string path) { GetSubFiles(viewDatas, path); string[] directories = Directory.GetDirectories(path); if (null == directories || directories.Length == 0) return; foreach (string sub in directories) { if (IsGdbFile(sub)) { SetSysMeta(viewDatas, sub, "gdb"); continue; } if (IsOsgbFile(sub)) { SetSysMeta(viewDatas, sub, "osgb"); continue; } GetFiles(viewDatas, sub); } } /// /// 设置元数据 /// private static void SetSysMeta(ObservableCollection viewDatas, string path, string ext) { ViewData vd = new ViewData(); vd.ID = viewDatas.Count + 1; vd.FilePath = path; vd.Ext = "." + ext; vd.Status = "准备"; viewDatas.Add(vd); SetSysMeta(vd); DirectoryInfo di = new DirectoryInfo(vd.FilePath); vd.Meta.name = di.Name; vd.Meta.type = ext; } /// /// 获取子文件 /// private static void GetSubFiles(ObservableCollection viewDatas, string path) { string[] files = Directory.GetFiles(path); if (null == files || files.Length == 0) return; foreach (string file in files) { string ext = Path.GetExtension(file).ToLower(); if (!StaticData.ALL_EXTENSION.Contains(ext) || IsExcludeFile(file)) continue; ViewData vd = new ViewData(); vd.ID = viewDatas.Count + 1; vd.FilePath = file; vd.Ext = ext; vd.Status = "准备"; viewDatas.Add(vd); SetSysMeta(vd); FileInfo fi = new FileInfo(vd.FilePath); vd.Meta.name = fi.Name; vd.Meta.type = fi.Extension.ToLower().Replace(".", ""); } } /// /// 设置元数据 /// private static void SetSysMeta(ViewData vd) { SysMeta meta = new SysMeta(); meta.eventid = Guid.NewGuid().ToString(); meta.metaid = 0; meta.verid = 0; meta.guid = null; meta.path = vd.FilePath; // * meta.sizes = GetFileSizes(vd); meta.tab = null; meta.rows = 0; meta.create_user = CommonProp.UserId; meta.create_time = DateTime.Now; meta.bak = null; meta.geom = null; meta.layer = null; meta.depcode = CommonProp.Depcode; meta.dircode = CommonProp.Dircode; meta.ismeta = 0; meta.sensortype = CommonProp.SensorType; meta.acq_time = CommonProp.AcqTime; vd.Meta = meta; vd.Sizes = meta.sizes; } /// /// 获取文件大小 /// private static double GetFileSizes(ViewData vd) { if (File.Exists(vd.FilePath)) { if (vd.Ext == StaticData.SHP) { List files = GetShpFiles(vd.FilePath); return GetFileSizes(files.ToArray()); } else { FileInfo fi = new FileInfo(vd.FilePath); return Tools.SizeToMb(fi.Length); } } if (Directory.Exists(vd.FilePath)) { string[] files = Directory.GetFiles(vd.FilePath, "*", SearchOption.AllDirectories); return GetFileSizes(files); } return 0; } /// /// 获取文件大小 /// private static double GetFileSizes(string[] files) { if (null == files || files.Length == 0) return 0; double sizes = 0; foreach (string file in files) { FileInfo fi = new FileInfo(file); sizes += Tools.SizeToMb(fi.Length); } return sizes; } /// /// 获取SHP文件集合 /// private static List GetShpFiles(string shpPath) { List files = new List(); files.Add(shpPath); foreach (string ext in StaticData.SHP_EXT) { string file = shpPath.Replace(".shp", ext); if (File.Exists(file)) { files.Add(file); } } return files; } /// /// 是否为GDB文件 /// private static bool IsGdbFile(string path) { if (!Directory.Exists(path)) return false; DirectoryInfo info = new DirectoryInfo(path); if (!info.Name.ToLower().EndsWith(StaticData.GDB)) return false; string gdb = Path.Combine(path, StaticData.NGDB); return File.Exists(gdb); } /// /// 是否为OSGB文件 /// private static bool IsOsgbFile(string path) { if (!Directory.Exists(path)) return false; string meta = Path.Combine(path, "metadata.xml"); string data = Path.Combine(path, "Data"); return File.Exists(meta) && Directory.Exists(data); } /// /// 是/否为排除文件 /// private static bool IsExcludeFile(string file) { bool isExclude = false; string name = Path.GetFileName(file).ToLower(); foreach (string ext in StaticData.MAPPER_EXCLUDE_EXT) { if (name.EndsWith(ext)) { isExclude = true; break; } } return isExclude; } /// /// 获取文件的MD5码 /// private static string GetFileMD5(string file) { if ("1" != Tools.GetSetting("GetMD5") || !File.Exists(file)) return null; return MD5Helper.GetMD5Hash(file); } /// /// 获取多个文件的MD5码 /// private static string GetFilesMD5(string path) { if ("1" != Tools.GetSetting("GetMD5") || !Directory.Exists(path)) return null; string[] files = Directory.GetFiles(path, "*", SearchOption.AllDirectories); if (null == files || files.Length == 0) return null; List list = new List(); foreach (string file in files) { string md5 = MD5Helper.GetMD5Hash(file); if (string.IsNullOrEmpty(md5)) list.Add(md5); } if (list.Count == 0) return null; string str = string.Join(",", list.ToArray()); byte[] bytes = Encoding.Unicode.GetBytes(str); return MD5Helper.GetMD5Hash(bytes); } #endregion #region 导入 /// /// 导入文件 /// public static void ImportFiles(ObservableCollection viewDatas) { Parallel.ForEach(viewDatas, (vd, ParallelLoopState) => { try { // SysMeta meta = new SysMeta(); // int id = DBHelper.InsertMeta(meta); vd.Status = id > 0 ? "成功。" : "失败!"; } catch (Exception ex) { LogOut.Error(ex.StackTrace); vd.Status = string.Format("失败:{0}!", ex.Message); } }); } /// /// 复制文件 /// private static void CopyFile(string source, string target) { if (File.Exists(source)) { File.Copy(source, target, true); } } public static void ImportFiles(ObservableCollection viewDatas, string target, int start) { /*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 subPath = GetSubPath(target, start); SysMeta mf = GetMetaFile(vd, subPath, guid); vd.Status = "复制文件..."; CopyFile(vd.FilePath, Path.Combine(target, mf.path)); vd.Status = "准备入库"; vd.Meta = mf; });*/ } public static void ImportFiles2(ObservableCollection viewDatas, string target) { int start = 1; foreach (ViewData vd in viewDatas) { try { vd.Status = "插入数据库..."; start = GetSubPath(target, start); SysMeta mf = GetMetaFile(vd, start, ""); int metaId = 0; // 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; } #endregion } }