Member 13699897 Ответов: 1

Запустите службу windows, если в fodler добавлен новый файл


Привет,

Я хочу вызвать запуск службы windows, если в папку добавлен новый XML-файл(с помощью filesystemwatcher)

1. папка монитора - если добавлен новый xml-файл
2. запустить сервис - выполнить действие в сервисе.
3. обслуживание стопа
4. Создайте журнал
5 и переместите xml - файл в архив.

Пожалуйста, помогите мне с образцом кода.

Спасибо,
Дипти.

Что я уже пробовал:

Я попробовал это сделать
Как реализовать простую службу filewatcher Windows на языке C#[^]

Richard Deeming

Таким образом, вы хотите, чтобы служба работала все время, отслеживая каталог, который запускает и останавливает второй сервис при создании файла?!

Просто есть одна услуга. При создании файла необходимо либо выполнить код для его обработки, либо запустить внешнее консольное приложение для его обработки.

#realJSOP

Как сказал Ричард, просто используйте один сервис, но я говорю вам, что использование FileSystemWatcher может быть излишним, если вы просто смотрите одну папку. Вы можете легко поместить его в поток и просто проверять наличие новых файлов так часто (1 минута или около того, в зависимости от того, насколько немедленным должен быть ответ).

Member 13699897

Спасибо за предложения Ричарду и Джону. Да, я хочу создать единую службу, которая может отслеживать папку и запускать и останавливать службу всякий раз, когда в эту папку добавляется новый XML-файл.
Пожалуйста, помогите мне с образцом кода.

ZurdoDev

Повсюду есть примеры кода. Этот конкретный форум предназначен для того, чтобы задавать конкретные вопросы по коду, на котором вы застряли.

Member 13699897

Я мог бы найти пример кода для создания служб windows, и я создал один для filesystemwatcher.
Я также создал другую службу, которая выполняет код всякий раз, когда я запускаю и останавливаю службу. Я застрял на объединении этих услуг. Я хочу знать, есть ли лучший способ создать одну службу(создать единую службу, которая может отслеживать папку и запускать запуск и остановку службы всякий раз, когда в эту папку добавляется новый XML-файл)
Спасибо.

#realJSOP

Это очень плохой дизайн. Вы можете - и должны - сделать это с помощью всего одной услуги. Почему вы чувствуете необходимость использовать для этого две службы?

F-ES Sitecore

Если у вас есть служба, которая работает с файлом, и вам нужна Служба, чтобы запустить эту службу при изменении файла, то что запускает эту службу, чтобы узнать, что файл изменился? Конечно, вам нужна Служба, чтобы запустить службу, которая запускает службу? Но как *эта* служба знает, что нужно запустить? Вам нужна Служба, чтобы запустить службу, чтобы начать ... вы поняли эту идею :)

Используйте одну службу, и эта служба будет работать все время, вот как вы используете службы, они запускаются один раз и работают вечно.

1 Ответов

Рейтинг:
0

#realJSOP

Ваш дизайн неэффективен и без необходимости увеличивает сложность проекта.

Я бы сделал это с помощью одного многопоточного сервиса, который не использует FileSystemWatcher.

Основной поток будет отслеживать рассматриваемую папку на наличие новых файлов (для этого я буду использовать библиотеку React/Rx).

Когда обнаруживается новый файл, он запускает другой поток (или асинхронную задачу) для выполнения любого действия, которое необходимо выполнить с файлом.

Причина использования потоков заключается в том, что вы никогда не знаете, сколько времени потребуется для обработки файла, и вы не хотите откладывать обработку последующих файлов.

Предоставление соответствующего "примерного кода" для этого действительно превысило бы то, для чего предназначен Q/A. То, что вы должны сделать, - это сделать хотя бы одну попытку написать код самостоятельно и прийти сюда, когда у вас возникнут вопросы.


Member 13699897

мой код-
использование системы;
использование системы.Коллекции.Общий;
использование системы.ComponentModel;
использование системы.Конфигурация;
использование System.Data;
использование системы.Диагностика;
использование системы.ИО;
использование System.Linq;
использование системы.Сервисный процесс;
использование System.Text;
использование системы.Нарезание резьбы.Задачи;

пространство имен PublicationService
{
частичный класс Service1 : ServiceBase
{
общественные службы service1()
{
метод InitializeComponent();
}

общественного недействительными отладки()
{
KillProcess();
}

защищенное переопределение void OnStart(string[] args)
{
// TODO: добавьте код здесь, чтобы запустить свой сервис.
Log("Мониторинг Запущен");
fileSystemWatcher1.EnableRaisingEvents = true в;
fileSystemWatcher1.Path = ConfigurationManager.Параметр Appsettings["WatchPath"];
fileSystemWatcher1.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.имя файла
| NotifyFilters.Каталог название;
fileSystemWatcher1.Изменено += новый FileSystemEventHandler(fileSystemWatcher1_Created);
}

охраняемых переопределить недействительными, то onStop()
{
// TODO: добавьте сюда код для выполнения любого демонтажа, необходимого для остановки вашего сервиса.
fileSystemWatcher1.EnableRaisingEvents = ложь;
fileSystemWatcher1.Распоряжаться();
Журнал("Мониторинг Остановлен");
}

частный void KillProcess()
{
Сроки ожидания = времени.Фроммиллисекунды(0);
пробовать
{
строка processName = "explorer"; //"InDesignServer.exe";
Процесс[] процессы = процессы.GetProcessesByName(имя процесса);
по каждому элементу (ВАР процесса в процессы)
{
если (процесс.Имя процесса.Содержит(processName))
{
процесс.Убивать();
процесс.WaitForExit(Конвертировать.ToInt32(тайм-аут));
Log("убитый процесс");
}
}
}
catch (исключение)
{
// игнорируемый
}
}
private void Log(строковое сообщение)
{
пробовать
{
строка logmessage = $"{message} {Environment.NewLine}";
строка logpath = ConfigurationManager.Параметр Appsettings["Пути Журнала"];
использовать файл.Существует(логпат))? Файл.AppendText(logpath) : файл.CreateText(logpath))
{
Файл.AppendAllText(ConfigurationManager.AppSettings["LogPath"], logmessage);
}

}
catch (исключение)
{
// игнорируемый
}
}

частная fileSystemWatcher1_Created недействительным(объект отправителя, FileSystemEventArgs е)
{
Log(строка.Формат("файл изменен :путь:{0}, именем{0}", е.Полный путь, по электронной.Название));
KillProcess();
}
}
}
я мог бы установить службу, но когда я начинаю, она автоматически останавливается. Не знаю почему.

#realJSOP

Поместите свой код в свой вопрос. Ваша служба сразу же останавливается, потому что она дошла до конца метода OnStart, и нет никакого потока, поддерживающего ее жизнь. Теперь вы понимаете, почему я сказал Не использовать FileSystemWatcher?