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; 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; } #endregion #region 导入 /// /// 导入文件 /// public static void ImportFiles(ObservableCollection viewDatas) { Parallel.ForEach(viewDatas, (vd, ParallelLoopState) => { try { vd.Status = "生成MD5码..."; vd.Meta.guid = GetFilesMD5(vd); if (!string.IsNullOrEmpty(vd.Meta.guid) && DBHelper.IsFileExists(vd.Meta.guid)) { vd.Status = "已存在!"; return; } vd.Status = "读取栅格信息..."; ReadRasterInfo(vd); vd.Status = "复制文件..."; CopyFiles(vd); vd.Status = "元数据入库..."; int id = DBHelper.InsertMeta(vd.Meta); vd.Status = id > 0 ? "成功。" : "失败!"; } catch (Exception ex) { LogOut.Error(ex.StackTrace); vd.Status = string.Format("失败:{0}!", ex.Message); } }); } /// /// 获取文件的MD5 /// private static string GetFilesMD5(ViewData vd) { if ("1" != Tools.GetSetting("GetMD5")) return null; if (File.Exists(vd.FilePath)) { if (vd.Ext == StaticData.SHP) { List files = GetShpFiles(vd.FilePath); return GetFilesMD5(files.ToArray()); } else { return MD5Helper.GetMD5Hash(vd.FilePath); } } if (Directory.Exists(vd.FilePath)) { string[] files = Directory.GetFiles(vd.FilePath, "*", SearchOption.AllDirectories); return GetFilesMD5(files); } return null; } /// /// 获取多个文件的MD5码 /// private static string GetFilesMD5(string[] files) { 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); } /// /// 读取栅格信息 /// private static void ReadRasterInfo(ViewData vd) { if (!StaticData.RASTER_EXT.Contains(vd.Ext) || !File.Exists(vd.FilePath)) return; GdalHelper.Instance.ReadRasterInfo(vd); } /// /// 复制文件 /// private static void CopyFiles(ViewData vd) { if (string.IsNullOrEmpty(vd.Meta.guid)) vd.Meta.guid = vd.Meta.eventid; switch (vd.Ext) { case StaticData.MPT: copyMultiFile(vd, StaticData.MPT_EXT); break; case StaticData.JPG: copyMultiFile(vd, StaticData.JPG_EXT); break; case StaticData.IMG: copyMultiFile(vd, StaticData.IMG_EXT); break; case StaticData.TIF: copyMultiFile(vd, StaticData.TIF_EXT); break; case StaticData.TIFF: copyMultiFile(vd, StaticData.TIFF_EXT); break; case StaticData.SHP: copyMultiFile(vd, StaticData.SHP_EXT); break; case StaticData.OSGB: copyFolderFile(vd); break; case StaticData.GDB: copyFolderFile(vd); break; default: copySingleFile(vd); break; } } /// /// 复制文件夹 /// private static int copyFolderFile(ViewData vd) { if (!Directory.Exists(vd.FilePath)) return -1; int count = 0; string[] files = Directory.GetFiles(vd.FilePath, "*", SearchOption.AllDirectories); foreach (string file in files) { try { // count++; } catch (Exception ex) { LogOut.Error(ex.StackTrace); } } return count; } /// /// 复制多个文件 /// private static int copyMultiFile(ViewData vd, List exts) { int count = copySingleFile(vd); if (count < 0) return -1; string target = Path.Combine(CommonProp.TargetPath, vd.Meta.path); foreach (string ext in exts) { try { File.Copy(vd.FilePath.Replace(vd.Ext, ext), target.Replace(vd.Ext, ext), true); count++; } catch (Exception ex) { LogOut.Error(ex.StackTrace); } } return count; } /// /// 复制单文件 /// private static int copySingleFile(ViewData vd) { if (!File.Exists(vd.FilePath)) return -1; vd.Meta.path = Path.Combine("" + GetSubPath(), vd.Meta.guid + vd.Ext); string target = Path.Combine(CommonProp.TargetPath, vd.Meta.path); if (File.Exists(target)) return 0; try { File.Copy(vd.FilePath, target, true); return 1; } catch (Exception ex) { LogOut.Error(ex.StackTrace); return -1; } } /// /// 获取子目录 /// private static int GetSubPath() { int start = 0; int.TryParse(Tools.GetSetting("StartPath"), out start); while (true) { string path = Path.Combine(CommonProp.TargetPath, start.ToString()); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); return start; } string[] files = Directory.GetFiles(path); if (files.Length <= StaticData.MAX_FILES) { return start; } start++; } } #endregion } }