239 lines
7.2 KiB
C#
239 lines
7.2 KiB
C#
using System.Text;
|
||
using Infrastructure.Helpers;
|
||
using Newtonsoft.Json;
|
||
using NPOI.HSSF.Record;
|
||
using NUnit.Framework;
|
||
using OpenAuth.Repository.Domain;
|
||
using Quartz;
|
||
|
||
namespace OpenAuth.App.ServiceApp.Job;
|
||
|
||
class FileMonitor : IJob
|
||
{
|
||
public async System.Threading.Tasks.Task Execute(IJobExecutionContext context)
|
||
{
|
||
var targetDirectory = ConfigHelper.GetConfigRoot().GetSection("Insight:Dir").Value;
|
||
var tifExtensions = new[] { ".tif", ".tfw", ".ovr", ".aux" };
|
||
// 相关文件扩展名
|
||
var shpExtensions = new[] { ".shp", ".shx", ".dbf", ".prj", ".cpg" };
|
||
var targetExtensions = new[] { ".tif", ".shp" };
|
||
|
||
// 遍历目标目录,查找所有 .shp 文件
|
||
//string[] shpFiles = Directory.GetFiles(targetDirectory, "*.shp", SearchOption.AllDirectories);
|
||
/*var shpFiles = Directory.EnumerateFiles(targetDirectory)
|
||
.Where(file => targetExtensions.Any(ext => file.EndsWith(ext, StringComparison.OrdinalIgnoreCase)));*/
|
||
|
||
DirectoryInfo directoryInfo = new DirectoryInfo(targetDirectory);
|
||
FileInfo[] shpFiles = directoryInfo.EnumerateFiles("*", SearchOption.AllDirectories)
|
||
.Where(file => targetExtensions.Contains(file.Extension.ToLower()))
|
||
.ToArray();
|
||
|
||
|
||
foreach (var fileInfo in shpFiles)
|
||
{
|
||
var file = fileInfo.FullName;
|
||
var baseFileName = Path.GetFileNameWithoutExtension(file);
|
||
var directory = Path.GetDirectoryName(file);
|
||
if (file.EndsWith(".shp"))
|
||
{
|
||
if (IsShpFileComplete(directory, baseFileName, shpExtensions))
|
||
{
|
||
var result = await AddInsAiShp(file);
|
||
Console.WriteLine("shp提交结果:" + result);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (IsTifFileComplete(directory, baseFileName, tifExtensions))
|
||
{
|
||
Console.WriteLine($"{baseFileName} 及其相关文件已完整拷贝到 {targetDirectory}");
|
||
await AddInsTif(file);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
public static bool IsTifFileComplete(string targetDirectory, string baseFileName, string[] extensions)
|
||
{
|
||
foreach (var extension in extensions)
|
||
{
|
||
string targetFilePath = Path.Combine(targetDirectory, baseFileName + extension);
|
||
|
||
if (!File.Exists(targetFilePath))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// 检查文件是否仍在写入
|
||
if (IsFileLocked(new FileInfo(targetFilePath)))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
public static bool IsShpFileComplete(string targetDirectory, string baseFileName, string[] extensions)
|
||
{
|
||
foreach (var extension in extensions)
|
||
{
|
||
string targetFilePath = Path.Combine(targetDirectory, baseFileName + extension);
|
||
|
||
if (!File.Exists(targetFilePath))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
// 检查文件是否仍在写入
|
||
if (IsFileLocked(new FileInfo(targetFilePath)))
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
public static bool IsFileLocked(FileInfo file)
|
||
{
|
||
FileStream stream = null;
|
||
|
||
try
|
||
{
|
||
stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
|
||
}
|
||
catch (IOException)
|
||
{
|
||
// 文件被锁定
|
||
return true;
|
||
}
|
||
finally
|
||
{
|
||
if (stream != null)
|
||
{
|
||
stream.Close();
|
||
}
|
||
}
|
||
|
||
// 文件未被锁定
|
||
return false;
|
||
}
|
||
|
||
private static async Task<bool> AddInsTif(string tifPath)
|
||
{
|
||
using var client = new HttpClient();
|
||
var config = ConfigHelper.GetConfigRoot();
|
||
var serverUrl = config.GetSection("Insight:ServerUrl").Value;
|
||
var url = serverUrl + "/api/InsTif/Insert";
|
||
|
||
var tifName = Path.GetFileName(tifPath);
|
||
var tifDate = new DirectoryInfo(tifPath).Parent?.Name;
|
||
if (string.IsNullOrEmpty(tifDate))
|
||
{
|
||
throw new Exception("获取不到日期目录");
|
||
}
|
||
|
||
var areaName = new DirectoryInfo(tifPath).Parent?.Parent?.Name;
|
||
DateTime tiffDate;
|
||
try
|
||
{
|
||
tiffDate = DateTime.ParseExact(tifDate, "yyyy年MM月", null);
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
Console.WriteLine(e);
|
||
return false;
|
||
}
|
||
|
||
var currentTime = DateTime.Now;
|
||
var tifRecord = new InsTif
|
||
{
|
||
TifName = tifName,
|
||
TifPath = tifPath,
|
||
Remark = "备注",
|
||
TifDate = tiffDate,
|
||
CreateTime = currentTime,
|
||
UpdateTime = currentTime,
|
||
AreaName = areaName,
|
||
PlotName = "地块",
|
||
AreaId = "areaid",
|
||
AreaNum = Convert.ToDecimal(0)
|
||
};
|
||
// 将数据对象序列化为 JSON 字符串
|
||
var json = JsonConvert.SerializeObject(tifRecord);
|
||
|
||
// 创建 HttpContent 对象
|
||
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
||
// 发送 POST 请求
|
||
var response = await client.PostAsync(url, content);
|
||
if (response.IsSuccessStatusCode)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
private static async Task<bool> AddInsAiShp(String shpPath)
|
||
{
|
||
using var client = new HttpClient();
|
||
var config = ConfigHelper.GetConfigRoot();
|
||
var serverUrl = config.GetSection("Insight:ServerUrl").Value;
|
||
var url = serverUrl + "/api/InAiShp/Insert";
|
||
|
||
// 县区/shp名称
|
||
var fileName = Path.GetFileName(shpPath);
|
||
var dateStr = fileName.Substring(0, 6);
|
||
DateTime date;
|
||
try
|
||
{
|
||
date = DateTime.ParseExact(dateStr, "yyMMdd", null);
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
var areaName = new DirectoryInfo(shpPath).Parent?.Parent?.Name;
|
||
if (areaName == null)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
var shpInfo = ShpUtil.GetShpInfo(shpPath);
|
||
var insAishp = new InsAishp();
|
||
var currentTime = DateTime.Now;
|
||
|
||
//insAishp.Id = Guid.NewGuid().ToString();
|
||
insAishp.ShpPath = shpPath;
|
||
insAishp.ShpName = fileName;
|
||
insAishp.ShpDate = date;
|
||
// 面积
|
||
insAishp.AreaNum = 0;
|
||
insAishp.PlotName = "地块名称";
|
||
insAishp.AreaId = "areaId";
|
||
// 地区名称
|
||
insAishp.AreaName = areaName;
|
||
// 包含图斑数量
|
||
insAishp.ShpCount = shpInfo.GetType().GetProperty("Count").GetValue(shpInfo);
|
||
;
|
||
insAishp.CreateTime = currentTime;
|
||
insAishp.UpdateTime = currentTime;
|
||
insAishp.Remark = "备注";
|
||
|
||
|
||
var json = JsonConvert.SerializeObject(insAishp);
|
||
|
||
// 创建 HttpContent 对象
|
||
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
||
// 发送 POST 请求
|
||
var response = await client.PostAsync(url, content);
|
||
if (response.IsSuccessStatusCode)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
} |