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<String> Exclusions = new List<string>() {
|
"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<DbParameter> list = Tool.GetParams<SysMeta>(insertMeta, meta);
|
|
object obj = Helper.GetScalar(insertMeta, list.ToArray());
|
|
return obj == null ? 0 : Convert.ToInt32(obj);
|
}
|
|
public static void GetFiles(ObservableCollection<ViewData> 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<ViewData> 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<ViewData> 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);
|
}
|
}
|
}
|
}
|