Это мой код FileSystemWatcher.
Я смотрю несколько папок. Когда я копирую образец из 19 файлов в папку A, наблюдатель, похоже, правильно фиксирует события и отправляет их на мой сервер sftp.
Однако, если я загружаю Папку A и Папку B одновременно, она захватывает только события Папки A и иногда, даже не полный список событий.
Я видел этот ответ и был Интересно, как я могу преобразовать свой код, чтобы быть более похожим на их код? Кажется, я отправляю свои события в отдельный поток, но он все еще не захватывает все события.
{ ссылка }
public class Program
{
static FileSystemWatcher watcher;
public static void Main(string[] args)
{
StartWatchers();
// Run an infinite loop.
while (true)
{
string line = Console.ReadLine();
}
}
public static void StartWatchers()
{
ConfigurationData configurationData = new ConfigurationData();
var configurations = configurationData.GetAll();
List<FileSystemWatcher> watchers = new List<FileSystemWatcher>();
int i = 0;
foreach(var item in configurations)
{
watchers.Add(WatcherFactory(item));
i++;
}
foreach(FileSystemWatcher watcher in watchers)
{
watcher.EnableRaisingEvents = true;
Console.WriteLine("Watching folder {0}", watcher.Path);
i++;
}
}
public static FileSystemWatcher WatcherFactory(Data.Models.Configuration Input)
{
try
{
var maxThreads = 4;
// Times 2 as most machines have double the logic processers as cores
ThreadPool.SetMaxThreads(maxThreads, maxThreads * 2);
watcher = new FileSystemWatcher(Input.SourcePath);
watcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.DirectoryName |
NotifyFilters.FileName |
NotifyFilters.Security |
NotifyFilters.Size;
watcher.Changed += new FileSystemEventHandler((s, e) => FileWatcher_Changed(s, e, Input));
watcher.IncludeSubdirectories = false;
return watcher;
}
catch (IOException ioe)
{
Console.WriteLine("An Exception Occurred :" + ioe);
return null;
}
catch (Exception e)
{
Console.WriteLine("An Exception Occurred :" + e);
return null;
}
}
//This event adds the work to the Thread queue
private static void FileWatcher_Changed(object s, FileSystemEventArgs e, Data.Models.Configuration Input)
{
ThreadPool.QueueUserWorkItem((o) => ProcessFile(s, e, Input));
}
private static void ProcessFile(object s, FileSystemEventArgs e, Data.Models.Configuration Input)
{
// Based on the eventtype you do your operation
switch (e.ChangeType)
{
case WatcherChangeTypes.Changed:
ChangeEvent(s, e, Input);
break;
case WatcherChangeTypes.Created:
Console.WriteLine($"File is created: {e.Name}");
break;
case WatcherChangeTypes.Deleted:
Console.WriteLine($"File is deleted: {e.Name}");
break;
case WatcherChangeTypes.Renamed:
Console.WriteLine($"File is renamed: {e.Name}");
break;
}
}
static void ChangeEvent(object sender, FileSystemEventArgs e, Data.Models.Configuration Input)
{
try
{
watcher.EnableRaisingEvents = false;
Console.WriteLine("{0}, with path {1} has been {2}", e.Name, e.FullPath, e.ChangeType);
SFTP.Send(@e.FullPath, @Input.DestinationPath, @Input.PrivateKeyPath, Input.PrivateKeyPassword, Input.HostName, Input.PortNumber, Input.UserName, Input.Password);
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
finally
{
watcher.EnableRaisingEvents = true;
}
}
}
}