Browse Source

first commit

shjung 1 year ago
commit
2f06bd1f89
31 changed files with 1320 additions and 0 deletions
  1. 48 0
      .gitignore
  2. 25 0
      AipGateway.FileJob.Scheduler.sln
  3. 79 0
      AipGateway.FileJob.Scheduler/AipGateway.FileJob.Scheduler.csproj
  4. 21 0
      AipGateway.FileJob.Scheduler/App.config
  5. 32 0
      AipGateway.FileJob.Scheduler/Helper.cs
  6. 97 0
      AipGateway.FileJob.Scheduler/Program.cs
  7. 36 0
      AipGateway.FileJob.Scheduler/Properties/AssemblyInfo.cs
  8. 37 0
      AipGateway.FileJob.Scheduler/Service.Designer.cs
  9. 173 0
      AipGateway.FileJob.Scheduler/Service.cs
  10. 165 0
      AipGateway.FileJob.Scheduler/ServiceManager.cs
  11. 260 0
      AipGateway.FileJob.Scheduler/ServiceManagerNative.cs
  12. BIN
      AipGateway.FileJob.Scheduler/application.ico
  13. BIN
      AipGateway.FileJob.Scheduler/bin/Debug/AipGateway.FileJob.Scheduler.exe
  14. 24 0
      AipGateway.FileJob.Scheduler/bin/Debug/AipGateway.FileJob.Scheduler.exe.config
  15. BIN
      AipGateway.FileJob.Scheduler/bin/Debug/AipGateway.FileJob.Scheduler.pdb
  16. BIN
      AipGateway.FileJob.Scheduler/bin/Debug/System.Configuration.ConfigurationManager.dll
  17. 69 0
      AipGateway.FileJob.Scheduler/obj/AipGateway.FileJob.Scheduler.csproj.nuget.dgspec.json
  18. 16 0
      AipGateway.FileJob.Scheduler/obj/AipGateway.FileJob.Scheduler.csproj.nuget.g.props
  19. 2 0
      AipGateway.FileJob.Scheduler/obj/AipGateway.FileJob.Scheduler.csproj.nuget.g.targets
  20. 4 0
      AipGateway.FileJob.Scheduler/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs
  21. 0 0
      AipGateway.FileJob.Scheduler/obj/Debug/AipGatew.24C3B97D.Up2Date
  22. BIN
      AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.csproj.AssemblyReference.cache
  23. 1 0
      AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.csproj.CoreCompileInputs.cache
  24. 9 0
      AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.csproj.FileListAbsolute.txt
  25. BIN
      AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.exe
  26. BIN
      AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.pdb
  27. BIN
      AipGateway.FileJob.Scheduler/obj/Debug/DesignTimeResolveAssemblyReferences.cache
  28. BIN
      AipGateway.FileJob.Scheduler/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
  29. 212 0
      AipGateway.FileJob.Scheduler/obj/project.assets.json
  30. 10 0
      AipGateway.FileJob.Scheduler/obj/project.nuget.cache
  31. 0 0
      README.md

+ 48 - 0
.gitignore

@@ -0,0 +1,48 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+.git/
+.vs/
+
+### LOG ###
+/logs/
+/images/
+/fonts/
+/REAL-RUN/
+/ftp/
+
+/mip_data/
+/App_Data/
+/amd64/
+/bin/
+/obj/

+ 25 - 0
AipGateway.FileJob.Scheduler.sln

@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34728.123
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AipGateway.FileJob.Scheduler", "AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler.csproj", "{FBB9A43E-1CE2-44ED-A39F-91EF79F4ED9E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{FBB9A43E-1CE2-44ED-A39F-91EF79F4ED9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FBB9A43E-1CE2-44ED-A39F-91EF79F4ED9E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FBB9A43E-1CE2-44ED-A39F-91EF79F4ED9E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FBB9A43E-1CE2-44ED-A39F-91EF79F4ED9E}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {B6FFBEE0-6E3D-4A41-9EBB-99A0499DEEBE}
+	EndGlobalSection
+EndGlobal

+ 79 - 0
AipGateway.FileJob.Scheduler/AipGateway.FileJob.Scheduler.csproj

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{FBB9A43E-1CE2-44ED-A39F-91EF79F4ED9E}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>AipGateway.FileJob.Scheduler</RootNamespace>
+    <AssemblyName>AipGateway.FileJob.Scheduler</AssemblyName>
+    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject />
+  </PropertyGroup>
+  <PropertyGroup>
+    <ApplicationIcon>application.ico</ApplicationIcon>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.ServiceProcess" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Helper.cs" />
+    <Compile Include="Service.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Service.Designer.cs">
+      <DependentUpon>Service.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="ServiceManager.cs" />
+    <Compile Include="ServiceManagerNative.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="System.Configuration.ConfigurationManager">
+      <Version>8.0.0</Version>
+    </PackageReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="application.ico" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>

+ 21 - 0
AipGateway.FileJob.Scheduler/App.config

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<configSections>
+		<section name="deleteSettings" type="System.Configuration.NameValueSectionHandler" />
+	</configSections>
+	
+	<appSettings>
+		<add key="DeleteMinMinute" value="30" />
+	</appSettings>
+
+	<deleteSettings>
+		<add key="C:\Data\Target1" value="30"/>
+		<add key="C:\Data\Target2" value="40"/>
+		<add key="C:\Data\Target3" value="50"/>
+	</deleteSettings>
+
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
+	</startup>
+
+</configuration>

+ 32 - 0
AipGateway.FileJob.Scheduler/Helper.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+
+namespace AipGateway.FileJob.Scheduler
+{
+	internal static class Helper
+	{
+		public static (int h, int m) SplitMinutes(long minutes)
+		{
+			return ((int)Math.Floor(minutes / 60.0), (int)(minutes % 60));
+		}
+
+		public static int TryInt(string value, int defValue)
+		{
+            try
+            {
+                int number = int.Parse(value);
+                return number;
+            }
+            catch (FormatException)
+            {
+                Console.WriteLine("유효한 숫자 형식이 아닙니다.");
+                return defValue;
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"오류 발생: {ex.Message}");
+                return defValue;
+            }
+        }
+	}
+}

+ 97 - 0
AipGateway.FileJob.Scheduler/Program.cs

@@ -0,0 +1,97 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Configuration;
+using System.Linq;
+using System.Net.WebSockets;
+using System.Runtime.Remoting.Messaging;
+using System.ServiceProcess;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Xml;
+
+namespace AipGateway.FileJob.Scheduler
+{
+    internal static class Program
+    {
+        /// <summary>
+        /// 해당 애플리케이션의 주 진입점입니다.
+        /// </summary>
+        static void Main()
+        {
+            ReadSettingsFromConfig();
+            loadConfiguration();
+
+            ServiceBase[] ServicesToRun;
+            ServicesToRun = new ServiceBase[]
+            {
+                new Service()
+            };
+            ServiceBase.Run(ServicesToRun);
+        }
+        private static void loadConfiguration()
+        {
+            const string settingDeleteMinute = "DeleteMinute";
+            const string settingDeletePathCount = "DeletePathCount";
+            const string settingDeletePath = "DeletePath";
+
+            int DeleteMinute = 60 * 24;
+            string[] DeletePathsToWatch;
+
+            NameValueCollection nvc;
+
+            DeletePathsToWatch = null;
+
+            nvc = (NameValueCollection)ConfigurationManager.AppSettings;
+            if (nvc.AllKeys.Contains(settingDeleteMinute))
+            {
+                string tmpMinute = nvc[settingDeleteMinute];
+                DeleteMinute = Helper.TryInt(tmpMinute, DeleteMinute);
+                if (DeleteMinute < 30)
+                {
+                    Console.WriteLine($"삭제할 파일 생성 시간 기준이 너무작아 [{DeleteMinute}] 최소값인 30분으로 다시 설정합니다.");
+                    DeleteMinute = 30;
+                }
+            }
+
+            if (nvc.AllKeys.Contains(settingDeletePathCount))
+            {
+                int pathCount = Helper.TryInt(nvc[settingDeletePathCount], 0);
+                if (pathCount > 0)
+                {
+                    string[] tmpDeletePathsToWatch = new string[pathCount];
+                    for (int ii = 0; ii < pathCount; ii++)
+                    {
+                        string key = settingDeletePath + (ii + 1).ToString();
+                        if (nvc.AllKeys.Contains(key))
+                        {
+                            tmpDeletePathsToWatch[ii] = nvc[key];
+                        }
+                    }
+                    DeletePathsToWatch = tmpDeletePathsToWatch;
+                }
+            }
+        }
+
+        private static void ReadSettingsFromConfig()
+        {
+            var applicationSettings = ConfigurationManager.GetSection("deleteSettings") as NameValueCollection;
+            if (applicationSettings.Count == 0)
+            {
+                Console.WriteLine("Application Settings are not defined");
+            }
+            else
+            {
+                foreach (var key in applicationSettings.AllKeys)
+                {
+                    Console.WriteLine(key + " = " + applicationSettings[key]);
+                }
+            }
+
+        }
+
+
+    }
+}

+ 36 - 0
AipGateway.FileJob.Scheduler/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 
+// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
+// 이러한 특성 값을 변경하세요.
+[assembly: AssemblyTitle("AipGateway.FileJob.Scheduler")]
+[assembly: AssemblyDescription("AIP Gateway File Job Scheduler Service")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HANTE Information Co,. Ltd.")]
+[assembly: AssemblyProduct("AipGateway.File.JobService")]
+[assembly: AssemblyCopyright("Copyright (C) 2024, HANTE Information Co,. Ltd.")]
+[assembly: AssemblyTrademark("Copyright (C) 2024, HANTE Information Co,. Ltd.")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 
+// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
+// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
+[assembly: ComVisible(false)]
+
+// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
+[assembly: Guid("fbb9a43e-1ce2-44ed-a39f-91ef79f4ed9e")]
+
+// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
+//
+//      주 버전
+//      부 버전 
+//      빌드 번호
+//      수정 버전
+//
+// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
+// 기본값으로 할 수 있습니다.
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0")]
+[assembly: AssemblyFileVersion("1.0.0")]

+ 37 - 0
AipGateway.FileJob.Scheduler/Service.Designer.cs

@@ -0,0 +1,37 @@
+namespace AipGateway.FileJob.Scheduler
+{
+    partial class Service
+    {
+        /// <summary> 
+        /// 필수 디자이너 변수입니다.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// 사용 중인 모든 리소스를 정리합니다.
+        /// </summary>
+        /// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 구성 요소 디자이너에서 생성한 코드
+
+        /// <summary> 
+        /// 디자이너 지원에 필요한 메서드입니다. 
+        /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.ServiceName = "Service1";
+        }
+
+        #endregion
+    }
+}

+ 173 - 0
AipGateway.FileJob.Scheduler/Service.cs

@@ -0,0 +1,173 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.ComponentModel;
+using System.Configuration;
+using System.Data;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.ServiceProcess;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Timers;
+
+namespace AipGateway.FileJob.Scheduler
+{
+    public partial class Service : ServiceBase
+    {
+        private const string settingDeleteMinMinute = "DeleteMinMinute";
+        private const string settingDelete = "deleteSettings";
+
+        private int DefaultDeleteMinute = 60 * 24;
+        private string[] DeletePathsToWatchs = null;
+        private int[] DeleteMinutes = null;
+
+        private readonly ManualResetEvent stopEvent = null;
+        private System.Timers.Timer deletePathTimer = null;
+
+
+        public Service()
+        {
+            InitializeComponent();
+            loadConfiguration();
+        }
+        private void loadConfiguration()
+        {
+            int deleteMinMinute = 30;
+            NameValueCollection nvc  = (NameValueCollection)ConfigurationManager.AppSettings;
+            if (nvc.AllKeys.Contains(settingDeleteMinMinute))
+            {
+                string tmpMinute = nvc[settingDeleteMinMinute];
+                deleteMinMinute = Helper.TryInt(tmpMinute, deleteMinMinute);
+                if (deleteMinMinute < 30)
+                {
+                    Console.WriteLine($"삭제할 파일 생성 시간 기준이 너무작아 [{deleteMinMinute}] 최소값인 {deleteMinMinute}분으로 다시 설정합니다.");
+                    deleteMinMinute = 30;
+                }
+            }
+
+            try
+            {
+                var deleteSettings = ConfigurationManager.GetSection(settingDelete) as NameValueCollection;
+                if (deleteSettings.Count == 0)
+                {
+                    Console.WriteLine("등록되어 있는 작업 정보가 없습니다.");
+                }
+                else
+                {
+                    int jobCnt = 0;
+                    string[] tmpDeletePathsToWatchs = new string[deleteSettings.Count];
+                    int[] tmpDeleteMinutes = new int[deleteSettings.Count];
+                    foreach (var key in deleteSettings.AllKeys)
+                    {
+                        tmpDeletePathsToWatchs[jobCnt] = key;
+                        tmpDeleteMinutes[jobCnt] = Helper.TryInt(deleteSettings[key], DefaultDeleteMinute);
+                    }
+                    DeletePathsToWatchs = tmpDeletePathsToWatchs;
+                    DeleteMinutes = tmpDeleteMinutes;
+                }
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.ToString());
+                DeletePathsToWatchs = null;
+                DeleteMinutes = null;
+            }
+        }
+
+        protected override void OnStart(string[] args)
+        {
+            deletePathTimer = new System.Timers.Timer();
+            deletePathTimer.Interval = 60 * 1000; // 1시간마다 실행
+            deletePathTimer.Elapsed += Timer_Elapsed;
+            deletePathTimer.Start();
+            
+            serviceLoops();
+        }
+        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
+        {
+            try
+            {
+                serviceLoops();
+            }
+            catch (Exception ex)
+            {
+            }
+        }
+        private void serviceLoops()
+        {
+            try
+            {
+                if (DeletePathsToWatchs == null || DeletePathsToWatchs.Length == 0)
+                {
+                    Console.WriteLine("등록되어 있는 작업 정보가 없습니다. 설정정보를 다시 확인합니다.");
+                    loadConfiguration();
+                    return;
+                }
+
+                for (int ii = 0; ii < DeletePathsToWatchs.Length; ii++)
+                {
+                    Console.WriteLine($"Delete Watch Path: {DeletePathsToWatchs[ii]}");
+                    DeletePathFiles(DeletePathsToWatchs[ii], DeleteMinutes[ii]);
+                }
+            }
+            catch (Exception ex)
+            {
+            }
+        }
+
+
+        private void DeletePathFiles(string pathDir, int deleteMin)
+        {
+            if (System.IO.File.Exists(pathDir))
+            {
+                Console.WriteLine($"'{pathDir}'는 파일입니다.");
+            }
+            else if (Directory.Exists(pathDir))
+            {
+                Console.WriteLine($"'{pathDir}'는 디렉토리입니다.");
+                // 디렉토리 내 모든 파일 목록 가져오기 (하위 디렉토리 포함)
+                string[] fileNames = Directory.GetFiles(pathDir, "*", SearchOption.AllDirectories);
+                foreach (string file in fileNames)
+                {
+                    if (System.IO.File.Exists(file))
+                    {
+                        DeleteFile(file, deleteMin);
+                    }
+                }
+            }
+            else
+            {
+                Console.WriteLine($"'{pathDir}'는 존재하지 않는 경로입니다.");
+            }
+        }
+        private void DeleteFile(string fileName, int deleteMin)
+        {
+            if (System.IO.File.Exists(fileName))
+            {
+                Console.WriteLine($"'{fileName}'는 파일입니다.");
+                FileInfo fileInfo = new FileInfo(fileName);
+                if (fileInfo.CreationTime.Date < DateTime.Now.AddMinutes(-deleteMin))
+                {
+                    System.IO.File.Delete(fileName);
+                    Console.WriteLine($"'{fileName}'을 삭제했습니다.");
+                }
+            }
+        }
+
+        protected override void OnStop()
+        {
+            deletePathTimer.Stop();
+            stopService();
+        }
+
+        private void stopService()
+        {
+            stopEvent?.Set();
+            Thread.Sleep(5000);
+        }
+
+    }
+}

+ 165 - 0
AipGateway.FileJob.Scheduler/ServiceManager.cs

@@ -0,0 +1,165 @@
+using System;
+using System.Runtime.InteropServices;
+using System.Threading;
+
+namespace AipGateway.FileJob.Scheduler
+{
+	internal static class ServiceManager
+	{
+		public static bool ServiceInstall(string serviceName, string displayName, ServiceManagerNative.SERVICE_START dwStartType, string path)
+		{
+			IntPtr scManager;
+			IntPtr scService;
+
+			scManager = ServiceManagerNative.OpenSCManager(IntPtr.Zero, IntPtr.Zero, ServiceManagerNative.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
+			if (scManager.Equals(IntPtr.Zero)) {
+                Console.WriteLine("[서비스 설치] 서비스 관리자를 열지 못하였습니다.");
+                return false;
+            }
+
+            scService = ServiceManagerNative.CreateService(
+				scManager,
+				serviceName,
+                displayName,
+				ServiceManagerNative.SERVICE_ACCESS.SERVICE_ALL_ACCESS,
+				(uint)ServiceManagerNative.SERVICE_TYPE.SERVICE_WIN32_OWN_PROCESS,
+				(uint) dwStartType,
+				(uint) ServiceManagerNative.SERVICE_ERROR.SERVICE_ERROR_NORMAL,
+				path,
+				IntPtr.Zero,
+				IntPtr.Zero,
+				IntPtr.Zero,
+				IntPtr.Zero,
+				IntPtr.Zero);
+
+			ServiceManagerNative.CloseServiceHandle(scService);
+			ServiceManagerNative.CloseServiceHandle(scManager);
+
+			return true;
+		}
+		
+		unsafe public static bool ServiceUninstall(string serviceName)
+		{
+			IntPtr scManager;
+			IntPtr scService;
+
+			scManager = ServiceManagerNative.OpenSCManager(IntPtr.Zero, IntPtr.Zero, ServiceManagerNative.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
+			if (scManager.Equals(IntPtr.Zero))
+			{
+                Console.WriteLine("[서비스 설치 해제] 서비스 관리자를 열지 못하였습니다.");
+                return false;
+            }
+
+            scService = ServiceManagerNative.OpenService(scManager, serviceName, ServiceManagerNative.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
+			if (scService.Equals(IntPtr.Zero))
+			{
+                Console.WriteLine("[서비스 설치 해제] 서비스를 열지 못하였습니다.");
+                ServiceManagerNative.CloseServiceHandle(scManager);
+				return false;
+			}
+
+			IntPtr buf = Marshal.AllocHGlobal(sizeof(ServiceManagerNative.SERVICE_STATUS_PROCESS));
+			int buf_len = sizeof(ServiceManagerNative.SERVICE_STATUS_PROCESS);
+
+			for (int i = 0; i < 30; i++)
+			{
+				if (!ServiceManagerNative.QueryServiceStatusEx(scService, 0, buf, buf_len, out buf_len))
+				{
+					if (!buf.Equals(IntPtr.Zero))
+					{
+                        Marshal.FreeHGlobal(buf);
+                    }
+                    ServiceManagerNative.CloseServiceHandle(scService);
+					ServiceManagerNative.CloseServiceHandle(scManager);
+					return false;
+				}
+
+				ServiceManagerNative.SERVICE_STATUS_PROCESS pStatus = (ServiceManagerNative.SERVICE_STATUS_PROCESS)Marshal.PtrToStructure(buf, typeof(ServiceManagerNative.SERVICE_STATUS_PROCESS));
+
+				switch (pStatus.currentState)
+				{
+					case (int) ServiceManagerNative.SERVICE_STATE.SERVICE_RUNNING:
+						ServiceManagerNative.SERVICE_STATUS serviceStatus = new ServiceManagerNative.SERVICE_STATUS();
+						ServiceManagerNative.ControlService(scService, ServiceManagerNative.SERVICE_CONTROL.STOP, ref serviceStatus);
+						break;
+
+					case (int)ServiceManagerNative.SERVICE_STATE.SERVICE_STOPPED:
+						ServiceManagerNative.DeleteService(scService);
+						i = 30;
+						break;
+					default:
+						break;
+				}
+
+				Thread.Sleep(1000);
+			}
+
+			if (!buf.Equals(IntPtr.Zero))
+			{
+                Marshal.FreeHGlobal(buf);
+            }
+
+            ServiceManagerNative.CloseServiceHandle(scService);
+			ServiceManagerNative.CloseServiceHandle(scManager);
+
+			return true;
+		}
+
+		public static bool ServiceStart(string service_name)
+		{
+			IntPtr scManager;
+			IntPtr scService;
+
+			scManager = ServiceManagerNative.OpenSCManager(IntPtr.Zero, IntPtr.Zero, ServiceManagerNative.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
+			if (scManager.Equals(IntPtr.Zero))
+			{
+				Console.WriteLine("[서비스 실행] 서비스 관리자를 열지 못하였습니다.");
+                return false;
+            }
+
+            scService = ServiceManagerNative.OpenService(scManager, service_name, ServiceManagerNative.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
+			if (scService.Equals(IntPtr.Zero))
+			{
+                Console.WriteLine("[서비스 실행] 서비스를 열지 못하였습니다.");
+                ServiceManagerNative.CloseServiceHandle(scManager);
+				return false;
+			}
+
+			ServiceManagerNative.StartService(scService, 0, IntPtr.Zero);
+
+			ServiceManagerNative.CloseServiceHandle(scService);
+			ServiceManagerNative.CloseServiceHandle(scManager);
+
+			return true;
+		}
+		
+		public static bool ServiceStop(string service_name)
+		{
+			IntPtr scManager;
+			IntPtr scService;
+			ServiceManagerNative.SERVICE_STATUS serviceStatus = new ServiceManagerNative.SERVICE_STATUS();
+
+			scManager = ServiceManagerNative.OpenSCManager(IntPtr.Zero, IntPtr.Zero, ServiceManagerNative.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
+			if (scManager.Equals(IntPtr.Zero))
+			{
+                Console.WriteLine("[서비스 종료] 서비스 관리자를 열지 못하였습니다.");
+                return false;
+            }
+
+            scService = ServiceManagerNative.OpenService(scManager, service_name, ServiceManagerNative.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
+			if (scService.Equals(IntPtr.Zero))
+			{
+                Console.WriteLine("[서비스 종료] 서비스를 열지 못하였습니다.");
+                ServiceManagerNative.CloseServiceHandle(scManager);
+				return false;
+			}
+
+			ServiceManagerNative.ControlService(scService, ServiceManagerNative.SERVICE_CONTROL.STOP, ref serviceStatus);
+
+			ServiceManagerNative.CloseServiceHandle(scService);
+			ServiceManagerNative.CloseServiceHandle(scManager);
+
+			return true;
+		}
+	}
+}

+ 260 - 0
AipGateway.FileJob.Scheduler/ServiceManagerNative.cs

@@ -0,0 +1,260 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace AipGateway.FileJob.Scheduler
+{
+	internal static class ServiceManagerNative
+	{
+		#region Enums
+
+		[Flags]
+		public enum SCM_ACCESS : uint
+		{
+			SC_MANAGER_CONNECT = 0x00001,
+			SC_MANAGER_CREATE_SERVICE = 0x00002,
+			SC_MANAGER_ENUMERATE_SERVICE = 0x00004,
+			SC_MANAGER_LOCK = 0x00008,
+			SC_MANAGER_QUERY_LOCK_STATUS = 0x00010,
+			SC_MANAGER_MODIFY_BOOT_CONFIG = 0x00020,
+			SC_MANAGER_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED |
+				SC_MANAGER_CONNECT |
+				SC_MANAGER_CREATE_SERVICE |
+				SC_MANAGER_ENUMERATE_SERVICE |
+				SC_MANAGER_LOCK |
+				SC_MANAGER_QUERY_LOCK_STATUS |
+				SC_MANAGER_MODIFY_BOOT_CONFIG,
+			GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ |
+				SC_MANAGER_ENUMERATE_SERVICE |
+				SC_MANAGER_QUERY_LOCK_STATUS,
+			GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE |
+				SC_MANAGER_CREATE_SERVICE |
+				SC_MANAGER_MODIFY_BOOT_CONFIG,
+			GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE |
+				SC_MANAGER_CONNECT | SC_MANAGER_LOCK,
+			GENERIC_ALL = SC_MANAGER_ALL_ACCESS,
+		}
+
+		[Flags]
+		public enum SERVICE_ACCESS : uint
+		{
+			SERVICE_QUERY_CONFIG = 0x00001,
+			SERVICE_CHANGE_CONFIG = 0x00002,
+			SERVICE_QUERY_STATUS = 0x00004,
+			SERVICE_ENUMERATE_DEPENDENTS = 0x00008,
+			SERVICE_START = 0x00010,
+			SERVICE_STOP = 0x00020,
+			SERVICE_PAUSE_CONTINUE = 0x00040,
+			SERVICE_INTERROGATE = 0x00080,
+			SERVICE_USER_DEFINED_CONTROL = 0x00100,
+			SERVICE_ALL_ACCESS = (ACCESS_MASK.STANDARD_RIGHTS_REQUIRED |
+				SERVICE_QUERY_CONFIG |
+				SERVICE_CHANGE_CONFIG |
+				SERVICE_QUERY_STATUS |
+				SERVICE_ENUMERATE_DEPENDENTS |
+				SERVICE_START |
+				SERVICE_STOP |
+				SERVICE_PAUSE_CONTINUE |
+				SERVICE_INTERROGATE |
+				SERVICE_USER_DEFINED_CONTROL),
+			GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ |
+				SERVICE_QUERY_CONFIG |
+				SERVICE_QUERY_STATUS |
+				SERVICE_INTERROGATE |
+				SERVICE_ENUMERATE_DEPENDENTS,
+			GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE |
+				SERVICE_CHANGE_CONFIG,
+			GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE |
+				SERVICE_START |
+				SERVICE_STOP |
+				SERVICE_PAUSE_CONTINUE |
+				SERVICE_USER_DEFINED_CONTROL,
+			ACCESS_SYSTEM_SECURITY = ACCESS_MASK.ACCESS_SYSTEM_SECURITY,
+			DELETE = ACCESS_MASK.DELETE,
+			READ_CONTROL = ACCESS_MASK.READ_CONTROL,
+			WRITE_DAC = ACCESS_MASK.WRITE_DAC,
+			WRITE_OWNER = ACCESS_MASK.WRITE_OWNER,
+		}
+
+		public enum SERVICE_CONTROL : uint
+		{
+			STOP = 0x00000001,
+			PAUSE = 0x00000002,
+			CONTINUE = 0x00000003,
+			INTERROGATE = 0x00000004,
+			SHUTDOWN = 0x00000005,
+			PARAMCHANGE = 0x00000006,
+			NETBINDADD = 0x00000007,
+			NETBINDREMOVE = 0x00000008,
+			NETBINDENABLE = 0x00000009,
+			NETBINDDISABLE = 0x0000000A,
+			DEVICEEVENT = 0x0000000B,
+			HARDWAREPROFILECHANGE = 0x0000000C,
+			POWEREVENT = 0x0000000D,
+			SESSIONCHANGE = 0x0000000E
+		}
+
+		public enum SERVICE_STATE : uint
+		{
+			SERVICE_STOPPED = 0x00000001,
+			SERVICE_START_PENDING = 0x00000002,
+			SERVICE_STOP_PENDING = 0x00000003,
+			SERVICE_RUNNING = 0x00000004,
+			SERVICE_CONTINUE_PENDING = 0x00000005,
+			SERVICE_PAUSE_PENDING = 0x00000006,
+			SERVICE_PAUSED = 0x00000007
+		}
+
+		[Flags]
+		public enum SERVICE_TYPES : int
+		{
+			SERVICE_KERNEL_DRIVER = 0x00000001,
+			SERVICE_FILE_SYSTEM_DRIVER = 0x00000002,
+			SERVICE_WIN32_OWN_PROCESS = 0x00000010,
+			SERVICE_WIN32_SHARE_PROCESS = 0x00000020,
+			SERVICE_INTERACTIVE_PROCESS = 0x00000100
+		}
+
+		[Flags]
+		public enum SERVICE_TYPE : uint
+		{
+			SERVICE_KERNEL_DRIVER = 0x00000001,
+			SERVICE_FILE_SYSTEM_DRIVER = 0x00000002,
+			SERVICE_WIN32_OWN_PROCESS = 0x00000010,
+			SERVICE_WIN32_SHARE_PROCESS = 0x00000020,
+			SERVICE_INTERACTIVE_PROCESS = 0x00000100,
+		}
+
+		public enum SERVICE_START : uint
+		{
+			SERVICE_BOOT_START = 0x00000000,
+			SERVICE_SYSTEM_START = 0x00000001,
+			SERVICE_AUTO_START = 0x00000002,
+			SERVICE_DEMAND_START = 0x00000003,
+			SERVICE_DISABLED = 0x00000004,
+		}
+
+		public enum SERVICE_ERROR
+		{
+			SERVICE_ERROR_IGNORE = 0x00000000,
+			SERVICE_ERROR_NORMAL = 0x00000001,
+			SERVICE_ERROR_SEVERE = 0x00000002,
+			SERVICE_ERROR_CRITICAL = 0x00000003,
+		}
+
+		[Flags]
+		private enum ACCESS_MASK : uint
+		{
+			DELETE = 0x00010000,
+			READ_CONTROL = 0x00020000,
+			WRITE_DAC = 0x00040000,
+			WRITE_OWNER = 0x00080000,
+			SYNCHRONIZE = 0x00100000,
+			STANDARD_RIGHTS_REQUIRED = 0x000F0000,
+			STANDARD_RIGHTS_READ = 0x00020000,
+			STANDARD_RIGHTS_WRITE = 0x00020000,
+			STANDARD_RIGHTS_EXECUTE = 0x00020000,
+			STANDARD_RIGHTS_ALL = 0x001F0000,
+			SPECIFIC_RIGHTS_ALL = 0x0000FFFF,
+			ACCESS_SYSTEM_SECURITY = 0x01000000,
+			MAXIMUM_ALLOWED = 0x02000000,
+			GENERIC_READ = 0x80000000,
+			GENERIC_WRITE = 0x40000000,
+			GENERIC_EXECUTE = 0x20000000,
+			GENERIC_ALL = 0x10000000,
+			DESKTOP_READOBJECTS = 0x00000001,
+			DESKTOP_CREATEWINDOW = 0x00000002,
+			DESKTOP_CREATEMENU = 0x00000004,
+			DESKTOP_HOOKCONTROL = 0x00000008,
+			DESKTOP_JOURNALRECORD = 0x00000010,
+			DESKTOP_JOURNALPLAYBACK = 0x00000020,
+			DESKTOP_ENUMERATE = 0x00000040,
+			DESKTOP_WRITEOBJECTS = 0x00000080,
+			DESKTOP_SWITCHDESKTOP = 0x00000100,
+			WINSTA_ENUMDESKTOPS = 0x00000001,
+			WINSTA_READATTRIBUTES = 0x00000002,
+			WINSTA_ACCESSCLIPBOARD = 0x00000004,
+			WINSTA_CREATEDESKTOP = 0x00000008,
+			WINSTA_WRITEATTRIBUTES = 0x00000010,
+			WINSTA_ACCESSGLOBALATOMS = 0x00000020,
+			WINSTA_EXITWINDOWS = 0x00000040,
+			WINSTA_ENUMERATE = 0x00000100,
+			WINSTA_READSCREEN = 0x00000200,
+			WINSTA_ALL_ACCESS = 0x0000037F
+		}
+
+		#endregion
+
+		#region Structs
+
+		[StructLayout(LayoutKind.Sequential, Pack = 0)]
+		public struct SERVICE_STATUS
+		{
+			public SERVICE_TYPES dwServiceType;
+			public SERVICE_STATE dwCurrentState;
+			public uint dwControlsAccepted;
+			public uint dwWin32ExitCode;
+			public uint dwServiceSpecificExitCode;
+			public uint dwCheckPoint;
+			public uint dwWaitHint;
+		}
+
+		[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+		public struct SERVICE_STATUS_PROCESS
+		{
+			public int serviceType;
+			public int currentState;
+			public int controlsAccepted;
+			public int win32ExitCode;
+			public int serviceSpecificExitCode;
+			public int checkPoint;
+			public int waitHint;
+			public int processID;
+			public int serviceFlags;
+
+			public static explicit operator SERVICE_STATUS_PROCESS(IntPtr v)
+			{
+				throw new NotImplementedException(v.ToString());
+			}
+		}
+
+		#endregion
+
+		#region Functions
+
+		[DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
+		public static extern IntPtr OpenSCManager(string machineName, string databaseName, ServiceManagerNative.SCM_ACCESS dwAccess);
+
+		[DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)]
+		public static extern IntPtr OpenSCManager(IntPtr machineName, IntPtr databaseName, ServiceManagerNative.SCM_ACCESS dwAccess);
+
+		[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+		public static extern IntPtr CreateService(IntPtr hSCManager, string lpServiceName, string lpDisplayName, ServiceManagerNative.SERVICE_ACCESS dwDesiredAccess, uint dwServiceType, uint dwStartType, uint dwErrorControl, string lpBinaryPathName, string lpLoadOrderGroup, string lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword);
+
+		[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+		public static extern IntPtr CreateService(IntPtr hSCManager, string lpServiceName, string lpDisplayName, ServiceManagerNative.SERVICE_ACCESS dwDesiredAccess, uint dwServiceType, uint dwStartType, uint dwErrorControl, string lpBinaryPathName, IntPtr lpLoadOrderGroup, IntPtr lpdwTagId, IntPtr lpDependencies, IntPtr lpServiceStartName, IntPtr lpPassword);
+
+		[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+		public static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, ServiceManagerNative.SERVICE_ACCESS dwDesiredAccess);
+
+		[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+		public static extern bool QueryServiceStatusEx(IntPtr serviceHandle, int infoLevel, IntPtr buffer, int bufferSize, out int bytesNeeded);
+
+		[DllImport("advapi32", SetLastError = true)]
+		[return: MarshalAs(UnmanagedType.Bool)]
+		public static extern bool StartService(IntPtr hService, int dwNumServiceArgs, IntPtr lpServiceArgVectors);
+
+		[DllImport("advapi32.dll", SetLastError = true)]
+		[return: MarshalAs(UnmanagedType.Bool)]
+		public static extern bool ControlService(IntPtr hService, SERVICE_CONTROL dwControl, ref SERVICE_STATUS lpServiceStatus);
+
+		[DllImport("advapi32.dll", SetLastError = true)]
+		[return: MarshalAs(UnmanagedType.Bool)]
+		public static extern bool DeleteService(IntPtr hService);
+
+		[DllImport("advapi32.dll", SetLastError = true)]
+		[return: MarshalAs(UnmanagedType.Bool)]
+		public static extern bool CloseServiceHandle(IntPtr hSCObject);
+
+		#endregion
+	}
+}

BIN
AipGateway.FileJob.Scheduler/application.ico


BIN
AipGateway.FileJob.Scheduler/bin/Debug/AipGateway.FileJob.Scheduler.exe


+ 24 - 0
AipGateway.FileJob.Scheduler/bin/Debug/AipGateway.FileJob.Scheduler.exe.config

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<configSections>
+		<section name="deleteSettings" type="System.Configuration.NameValueSectionHandler" />
+	</configSections>
+	
+	<appSettings>
+		<add key="DeleteMinute" value="2" />
+		<add key="DeletePathCount" value="2" />
+		<add key="DeletePath1" value="C:\Data\Source" />
+		<add key="DeletePath2" value="C:\Data\Target" />
+	</appSettings>
+
+	<deleteSettings>
+		<add key="C:\Data\Target1" value="30"/>
+		<add key="C:\Data\Target2" value="40"/>
+		<add key="C:\Data\Target3" value="50"/>
+	</deleteSettings>
+
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
+	</startup>
+
+</configuration>

BIN
AipGateway.FileJob.Scheduler/bin/Debug/AipGateway.FileJob.Scheduler.pdb


BIN
AipGateway.FileJob.Scheduler/bin/Debug/System.Configuration.ConfigurationManager.dll


+ 69 - 0
AipGateway.FileJob.Scheduler/obj/AipGateway.FileJob.Scheduler.csproj.nuget.dgspec.json

@@ -0,0 +1,69 @@
+{
+  "format": 1,
+  "restore": {
+    "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler.csproj": {}
+  },
+  "projects": {
+    "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler.csproj": {
+      "version": "1.0.0",
+      "restore": {
+        "projectUniqueName": "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler.csproj",
+        "projectName": "AipGateway.FileJob.Scheduler",
+        "projectPath": "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler.csproj",
+        "packagesPath": "C:\\Users\\OpenValue\\.nuget\\packages\\",
+        "outputPath": "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\obj\\",
+        "projectStyle": "PackageReference",
+        "skipContentFileWrite": true,
+        "fallbackFolders": [
+          "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+        ],
+        "configFilePaths": [
+          "C:\\Users\\OpenValue\\AppData\\Roaming\\NuGet\\NuGet.Config",
+          "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+          "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+        ],
+        "originalTargetFrameworks": [
+          "net48"
+        ],
+        "sources": {
+          "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+          "https://api.nuget.org/v3/index.json": {}
+        },
+        "frameworks": {
+          "net48": {
+            "projectReferences": {}
+          }
+        },
+        "restoreAuditProperties": {
+          "enableAudit": "true",
+          "auditLevel": "low",
+          "auditMode": "direct"
+        }
+      },
+      "frameworks": {
+        "net48": {
+          "dependencies": {
+            "System.Configuration.ConfigurationManager": {
+              "target": "Package",
+              "version": "[8.0.0, )"
+            }
+          }
+        }
+      },
+      "runtimes": {
+        "win": {
+          "#import": []
+        },
+        "win-arm64": {
+          "#import": []
+        },
+        "win-x64": {
+          "#import": []
+        },
+        "win-x86": {
+          "#import": []
+        }
+      }
+    }
+  }
+}

+ 16 - 0
AipGateway.FileJob.Scheduler/obj/AipGateway.FileJob.Scheduler.csproj.nuget.g.props

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+    <RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
+    <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
+    <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
+    <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
+    <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\OpenValue\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
+    <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
+    <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.9.2</NuGetToolVersion>
+  </PropertyGroup>
+  <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+    <SourceRoot Include="C:\Users\OpenValue\.nuget\packages\" />
+    <SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
+  </ItemGroup>
+</Project>

+ 2 - 0
AipGateway.FileJob.Scheduler/obj/AipGateway.FileJob.Scheduler.csproj.nuget.g.targets

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

+ 4 - 0
AipGateway.FileJob.Scheduler/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs

@@ -0,0 +1,4 @@
+// <autogenerated />
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]

+ 0 - 0
AipGateway.FileJob.Scheduler/obj/Debug/AipGatew.24C3B97D.Up2Date


BIN
AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.csproj.AssemblyReference.cache


+ 1 - 0
AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.csproj.CoreCompileInputs.cache

@@ -0,0 +1 @@
+87985aaf211394eb4c12cdb8b7af36af5e597cc5718ba55689b2cf33723d99a9

+ 9 - 0
AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.csproj.FileListAbsolute.txt

@@ -0,0 +1,9 @@
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\bin\Debug\AipGateway.FileJob.Scheduler.exe.config
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\bin\Debug\AipGateway.FileJob.Scheduler.exe
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\bin\Debug\AipGateway.FileJob.Scheduler.pdb
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\bin\Debug\System.Configuration.ConfigurationManager.dll
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\obj\Debug\AipGateway.FileJob.Scheduler.csproj.AssemblyReference.cache
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\obj\Debug\AipGateway.FileJob.Scheduler.csproj.CoreCompileInputs.cache
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\obj\Debug\AipGatew.24C3B97D.Up2Date
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\obj\Debug\AipGateway.FileJob.Scheduler.exe
+C:\DEV\SOLUTION\IIS\AipGateway.FileJob.Scheduler\AipGateway.FileJob.Scheduler\obj\Debug\AipGateway.FileJob.Scheduler.pdb

BIN
AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.exe


BIN
AipGateway.FileJob.Scheduler/obj/Debug/AipGateway.FileJob.Scheduler.pdb


BIN
AipGateway.FileJob.Scheduler/obj/Debug/DesignTimeResolveAssemblyReferences.cache


BIN
AipGateway.FileJob.Scheduler/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache


+ 212 - 0
AipGateway.FileJob.Scheduler/obj/project.assets.json

@@ -0,0 +1,212 @@
+{
+  "version": 3,
+  "targets": {
+    ".NETFramework,Version=v4.8": {
+      "System.Configuration.ConfigurationManager/8.0.0": {
+        "type": "package",
+        "frameworkAssemblies": [
+          "System.Configuration"
+        ],
+        "compile": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "runtime": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "build": {
+          "buildTransitive/net462/_._": {}
+        }
+      }
+    },
+    ".NETFramework,Version=v4.8/win": {
+      "System.Configuration.ConfigurationManager/8.0.0": {
+        "type": "package",
+        "frameworkAssemblies": [
+          "System.Configuration"
+        ],
+        "compile": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "runtime": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "build": {
+          "buildTransitive/net462/_._": {}
+        }
+      }
+    },
+    ".NETFramework,Version=v4.8/win-arm64": {
+      "System.Configuration.ConfigurationManager/8.0.0": {
+        "type": "package",
+        "frameworkAssemblies": [
+          "System.Configuration"
+        ],
+        "compile": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "runtime": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "build": {
+          "buildTransitive/net462/_._": {}
+        }
+      }
+    },
+    ".NETFramework,Version=v4.8/win-x64": {
+      "System.Configuration.ConfigurationManager/8.0.0": {
+        "type": "package",
+        "frameworkAssemblies": [
+          "System.Configuration"
+        ],
+        "compile": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "runtime": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "build": {
+          "buildTransitive/net462/_._": {}
+        }
+      }
+    },
+    ".NETFramework,Version=v4.8/win-x86": {
+      "System.Configuration.ConfigurationManager/8.0.0": {
+        "type": "package",
+        "frameworkAssemblies": [
+          "System.Configuration"
+        ],
+        "compile": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "runtime": {
+          "lib/net462/System.Configuration.ConfigurationManager.dll": {
+            "related": ".xml"
+          }
+        },
+        "build": {
+          "buildTransitive/net462/_._": {}
+        }
+      }
+    }
+  },
+  "libraries": {
+    "System.Configuration.ConfigurationManager/8.0.0": {
+      "sha512": "JlYi9XVvIREURRUlGMr1F6vOFLk7YSY4p1vHo4kX3tQ0AGrjqlRWHDi66ImHhy6qwXBG3BJ6Y1QlYQ+Qz6Xgww==",
+      "type": "package",
+      "path": "system.configuration.configurationmanager/8.0.0",
+      "files": [
+        ".nupkg.metadata",
+        ".signature.p7s",
+        "Icon.png",
+        "LICENSE.TXT",
+        "PACKAGE.md",
+        "THIRD-PARTY-NOTICES.TXT",
+        "buildTransitive/net461/System.Configuration.ConfigurationManager.targets",
+        "buildTransitive/net462/_._",
+        "buildTransitive/net6.0/_._",
+        "buildTransitive/netcoreapp2.0/System.Configuration.ConfigurationManager.targets",
+        "lib/net462/System.Configuration.ConfigurationManager.dll",
+        "lib/net462/System.Configuration.ConfigurationManager.xml",
+        "lib/net6.0/System.Configuration.ConfigurationManager.dll",
+        "lib/net6.0/System.Configuration.ConfigurationManager.xml",
+        "lib/net7.0/System.Configuration.ConfigurationManager.dll",
+        "lib/net7.0/System.Configuration.ConfigurationManager.xml",
+        "lib/net8.0/System.Configuration.ConfigurationManager.dll",
+        "lib/net8.0/System.Configuration.ConfigurationManager.xml",
+        "lib/netstandard2.0/System.Configuration.ConfigurationManager.dll",
+        "lib/netstandard2.0/System.Configuration.ConfigurationManager.xml",
+        "system.configuration.configurationmanager.8.0.0.nupkg.sha512",
+        "system.configuration.configurationmanager.nuspec",
+        "useSharedDesignerContext.txt"
+      ]
+    }
+  },
+  "projectFileDependencyGroups": {
+    ".NETFramework,Version=v4.8": [
+      "System.Configuration.ConfigurationManager >= 8.0.0"
+    ]
+  },
+  "packageFolders": {
+    "C:\\Users\\OpenValue\\.nuget\\packages\\": {},
+    "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
+  },
+  "project": {
+    "version": "1.0.0",
+    "restore": {
+      "projectUniqueName": "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler.csproj",
+      "projectName": "AipGateway.FileJob.Scheduler",
+      "projectPath": "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler.csproj",
+      "packagesPath": "C:\\Users\\OpenValue\\.nuget\\packages\\",
+      "outputPath": "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\obj\\",
+      "projectStyle": "PackageReference",
+      "skipContentFileWrite": true,
+      "fallbackFolders": [
+        "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
+      ],
+      "configFilePaths": [
+        "C:\\Users\\OpenValue\\AppData\\Roaming\\NuGet\\NuGet.Config",
+        "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
+        "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+      ],
+      "originalTargetFrameworks": [
+        "net48"
+      ],
+      "sources": {
+        "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+        "https://api.nuget.org/v3/index.json": {}
+      },
+      "frameworks": {
+        "net48": {
+          "projectReferences": {}
+        }
+      },
+      "restoreAuditProperties": {
+        "enableAudit": "true",
+        "auditLevel": "low",
+        "auditMode": "direct"
+      }
+    },
+    "frameworks": {
+      "net48": {
+        "dependencies": {
+          "System.Configuration.ConfigurationManager": {
+            "target": "Package",
+            "version": "[8.0.0, )"
+          }
+        }
+      }
+    },
+    "runtimes": {
+      "win": {
+        "#import": []
+      },
+      "win-arm64": {
+        "#import": []
+      },
+      "win-x64": {
+        "#import": []
+      },
+      "win-x86": {
+        "#import": []
+      }
+    }
+  }
+}

+ 10 - 0
AipGateway.FileJob.Scheduler/obj/project.nuget.cache

@@ -0,0 +1,10 @@
+{
+  "version": 2,
+  "dgSpecHash": "ZY3C+DZlFqiuGjDp4ZHAb0CeBLYvT+TuMTDSYkd3YuPtuIi9Kw+l9QxpO3XkTjznoTBLbhKk9mG1FiBs1Qj77Q==",
+  "success": true,
+  "projectFilePath": "C:\\DEV\\SOLUTION\\IIS\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler\\AipGateway.FileJob.Scheduler.csproj",
+  "expectedPackageFiles": [
+    "C:\\Users\\OpenValue\\.nuget\\packages\\system.configuration.configurationmanager\\8.0.0\\system.configuration.configurationmanager.8.0.0.nupkg.sha512"
+  ],
+  "logs": []
+}

+ 0 - 0
README.md