File System Watcher в службе не обрабатывает файлы - PullRequest
0 голосов
/ 30 апреля 2018

Мне нужно запустить FileSystem Watcher из службы. Наблюдатель файловой системы добавляет файлы в список, событие истекшего таймера запускает некоторый код каждую 1 секунду, чтобы обработать входной файл из списка, обновленного наблюдателем

protected override void OnStart(string[] args)
{
    startwatching();
    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Elapsed += ATimer_Elapsed;
    aTimer.Interval = 1000;
    aTimer.Enabled = true;
}

void startwatching()
{
    watcher = new FileSystemWatcher();
    watcher.Path = watchpath;
    // labelControl10.Text = "Monitoring-> " + watcher.Path;
    watcher.Filter = "*.*";
    // watcher.NotifyFilter = NotifyFilters.CreationTime;
    watcher.Created += new FileSystemEventHandler(copied);
    watcher.EnableRaisingEvents = true;
}

void copied(object sender, FileSystemEventArgs e)
{
    if (!robotprocesslist.Contains(e.FullPath))
    {
        try
        {
            robotprocesslist.Add(e.FullPath);
        }
        catch (OutOfMemoryException error)
        {
        }
    }
}

private void ATimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    //do stuff
}

Но файлы не обрабатываются. Что я делаю не так? Пожалуйста, совет.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы, вероятно, должны использовать Очередь вместо списка и обрабатывать свои файлы в выделенном потоке. Непонятно, что вы делаете в событии таймера, но вполне возможно, что вы пытаетесь обрабатывать одни и те же файлы несколько раз.

Ваше событие «Создано» вызывается только один раз, когда файл создается или начинается копирование файла, и, вероятно, это займет несколько секунд, пока оно не будет завершено, поэтому вполне вероятно, что ваши файлы заблокированы в вашем событии таймера. Файлы блокируются до тех пор, пока файл копируется, поэтому вы не сможете выполнять большую часть обработки, пока не будет завершено копирование / создание файла.

Взгляните на мой ответ здесь: Использование file.move для переименования новых файлов в C # Это тест консольного приложения, который реализует обработку файлов в отдельных потоках (по одному на созданный файл).

0 голосов
/ 30 апреля 2018

Я думаю, что ваша проблема здесь:

if (!robotprocesslist.Contains(e.FullPath))

Я подозреваю, что ваш список выглядит так:

file1.txt
file2.txt

И это проверяет:

c:\file1.txt

И так, никогда не найдя файл в списке.

Как отметил @ Уве Кейм - некоторые записи могут помочь доказать эту теорию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...