-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWorker.cs
120 lines (100 loc) · 4.36 KB
/
Worker.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using SimpleFtpFileWatcher.Services;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace SimpleFtpFileWatcher {
public class Worker : BackgroundService {
private readonly ILogger<Worker> _logger;
private FileSystemWatcher _folderWatcher;
public AppSettings _settings;
private readonly IServiceProvider _services;
public Worker (ILogger<Worker> logger, IOptions<AppSettings> settings, IServiceProvider services) {
_logger = logger;
_settings = settings.Value;
_services = services;
}
protected override async Task ExecuteAsync (CancellationToken stoppingToken) {
await Task.CompletedTask;
}
public override Task StartAsync (CancellationToken cancellationToken) {
var _inputFolder = _settings.WatchedFolder;
if (!Directory.Exists (_inputFolder)) {
_logger.LogCritical ($"Please make sure the folder [{_inputFolder}] exists, then restart the service.");
return Task.CompletedTask;
}
_logger.LogInformation ("Starting SimpleFTP File Watcher Service");
_folderWatcher = new FileSystemWatcher () {
NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.FileName,
IncludeSubdirectories = false,
Path = _inputFolder,
EnableRaisingEvents = true
};
if (string.IsNullOrEmpty(_settings.FtpRemote.Address) &&
string.IsNullOrEmpty(_settings.SftpRemote.Address))
{
_logger.LogCritical ("No remote address specified.");
return Task.CompletedTask;
}
foreach (var file in _settings.FtpRemote.FilesToWatch)
_folderWatcher.Filters.Add(file);
foreach (var file in _settings.SftpRemote.FilesToWatch)
_folderWatcher.Filters.Add(file);
_folderWatcher.Created += Input_OnChanged;
return base.StartAsync (cancellationToken);
}
protected void Input_OnChanged (object source, FileSystemEventArgs e) {
bool fileSent = false;
try {
if (e.ChangeType == WatcherChangeTypes.Created) {
_logger.LogInformation ($"Created Event by [{e.FullPath}]");
var fi = new FileInfo(e.Name);
var ext = $"*{fi.Extension.ToLower()}";
if (_settings.FtpRemote.FilesToWatch.Contains(e.Name) ||
_settings.FtpRemote.FilesToWatch.Contains(ext)) {
using (var scope = _services.CreateScope ()) {
var ftpService = scope.ServiceProvider.GetRequiredService<IFtpService> ();
ftpService.SendFile (e.Name, e.FullPath);
}
_logger.LogInformation ($"Sent {_settings.FtpRemote.Address}/{e.Name}");
fileSent = true;
}
if (_settings.SftpRemote.FilesToWatch.Contains(e.Name) ||
_settings.SftpRemote.FilesToWatch.Contains(ext)) {
using (var scope = _services.CreateScope ()) {
var sftpService = scope.ServiceProvider.GetRequiredService<ISftpService>();
sftpService.SendFile (e.Name, e.FullPath);
}
_logger.LogInformation ($"Sent {_settings.SftpRemote.Address}/{e.Name}");
fileSent = true;
}
if (_settings.DeleteAfterUpload && fileSent) {
_logger.LogInformation ("Deleting file after upload. To change this setting, modify appsettings.json.");
File.Delete (e.FullPath);
}
else {
_logger.LogInformation ("Appending date to uploaded file.");
File.Move(e.FullPath,e.FullPath.AppendTimeStamp(),true);
}
}
}
catch (Exception ex) {
_logger.LogError(ex,ex.Message);
}
}
public override async Task StopAsync (CancellationToken cancellationToken) {
_logger.LogInformation ("Stopping SimpleFTP File Watcher Service");
_folderWatcher.EnableRaisingEvents = false;
await base.StopAsync (cancellationToken);
}
public override void Dispose () {
_folderWatcher.Dispose ();
base.Dispose ();
}
}
}