Posiadam aplikację konsolową napisaną w c#. Odpalenie aplikacji powoduje odczytanie pliku tekstowego i dane z tego pliku są przetwarzane przez tą aplikację i zapisywane w bazie mssql.
Plik pojawia się cyklicznie co jakiś czas.
Chciał bym zrobić tak aby ten program raz odpalony działał cały czas i sam sprawdzał co zadany interwał czasu czy pojawił się plik. Jeśli tak to ma wczytać go, dane zapisać do bazy i przenieść zaimportowany plik do wskazanego folderu.
Kompletnie nie wiem jak się zabrać za to "ciągłe działanie programu" oraz cykliczne sprawdzanie czy pojawił się plik i jeśli pojawił to ma wywołać funkcję która wczyta dane z pliku do bazy.
Jak to ugryźć ?
Od tego są Windows Services. Dla łatwego pisania ich i instalowania proponuję użyć dodatek Topshelf: http://topshelf-project.com/ Twój serwis będzie działał w tle, i uruchamiał się przy starcie systemu (chyba że ustawiasz inaczej).
Użyj timera
using System;
using System.Timers;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var timer = new Timer(1000);
timer.Elapsed += Timer_Elapsed;
timer.Start();
Console.ReadKey();
}
private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("operacja wykonywana cyklicznie");
}
}
}
Może zamiast timera użyć czegoś takiego: https://docs.microsoft.com/pl-pl/dotnet/api/system.io.filesystemwatcher
Zamiast cyklicznie sprawdzać, czy coś się zmieniło, czy nie lepiej kazać systemowi nas informować o zmianach?
Sam pewien czas temu robiłem aplikację monitorującą zmiany na dysku. Było to w Pascalu, więc kodem się nie podzielę, ale mogę wskazać drogę. Główną atrakcja była funkcja WinAPI ReadDirectoryChangesW
- https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-readdirectorychangesw
Możesz też spróbować tym https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc748993(v=ws.11) wtedy obędzie się bez zmian w kodzie
Dziękuję bardzo za podpowiedzi i nakierowanie.
Pozdrawiam
Znalezione na szybko
public void CreateFileWatcher(string path)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.txt";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
private static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
Jeżeli program ma działać w tle to możesz użyć WinApi aby schować okno konsoli lub po prostu w ustawieniach projektu zmienić typ na aplikację okienkową.