Я боролся с ответом на этот вопрос, и после долгих исследований я объединил информацию с моим опытом и нашел следующий ответ:
//Purpose: Monitor changes to a folder and write to event log when a change
// happens.
//Last Mod date: 09/01/2019
//Author: Bheki
//Notes: The target folder is given in the parameter file. The first time the application runs must be run as an administrator.
using System;
using System.IO;
using System.Security.Permissions;
using System.Diagnostics;
using System.Threading;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Windows;
public class Watcher
{
public static void Main()
{
Run();
}
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public static void Run()
{
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = Watcher.GetTargetFolder().Item1;
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = Watcher.GetTargetFolder().Item2;
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
//watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
public static Tuple<string,string> GetTargetFolder()
{
string currentRecordOpenFile;
char ColumnDelimter = ","[0];
string TargetFolder = "";
string FixSelected = "";
string FileExtension = "";
string SecondHeader = "";
TargetFolder = System.IO.Directory.GetCurrentDirectory().Replace("\\", "/");
string ParameterFile = TargetFolder + "/ParameterFile.txt";
using (StreamReader objReader = new StreamReader(ParameterFile.Replace("\\", "/")))
{
while (!objReader.EndOfStream)
{
currentRecordOpenFile = objReader.ReadLine(); //this reads a whole line of input from the file
string[] LineOfFile = currentRecordOpenFile.Split(ColumnDelimter);
if (LineOfFile[0] == "Pathtofiles")
{
//we can skip the heading
continue;
}
else
{
TargetFolder = LineOfFile[0].Replace("\\", "/") + "/"; //this can be changed depending on how the output looks
FixSelected = LineOfFile[1];
FileExtension = LineOfFile[2];
SecondHeader = LineOfFile[3];
}
}
return Tuple.Create(TargetFolder, FileExtension);
}//End of stream for reading the parameter file
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
string vLog = "Application";
string vSource = "BCMPR";
if (!EventLog.SourceExists(vSource))
{
//An event log source should not be created and immediately used.
//There is a latency time to enable the source, it should be created
//prior to executing the application that uses the source.
//Execute this sample a second time to use the new source.
EventLog.CreateEventSource(vSource, vLog);
Console.WriteLine("CreatedEventSource");
Console.WriteLine("Exiting, execute the application a second time to use the source.");
// The source is created. Exit the application to allow it to be registered.
return;
}
// Create an EventLog instance and assign its source.
EventLog myLog = new EventLog();
myLog.Source = vSource;
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
Console.WriteLine("Writting to event log");
// Write an informational entry to the event log.
myLog.WriteEntry("The folder has been changed", EventLogEntryType.Information, 1307);
System.Environment.Exit(0);
}
}
В том же месте, что и приложение после того, как оно было встроено в C #. Пожалуйста, поместите файл ParameterFile.txt, и он имеет следующее содержимое:
Pathtofiles,FixSelected,FileExtension,SecondHeader
C:\Data\TEST,ALL,*.txt,TEST
Обратите внимание, что папка (C:\Data\TEST) и расширение файла (*. Txt) могут быть изменены в соответствии с требованиями пользователя.
// Средство просмотра событий Windows и настройка
После того, как этот код был запущен дважды и изменения были внесены в папку, наше событие можно увидеть в окне просмотра событий Windows. Пожалуйста, следуйте инструкциям на картинке:Журнал событий Windows и Настройка задач