Ответ, который я опубликовал вчера вечером, не прошел проверку регрессии. У меня были смешанные результаты и различные настройки фильтра наблюдателя файловой системы, и иногда они пропускали файлы, что неприемлемо. Существует множество статей о проблемах с сетевыми ресурсами, но я полагаю, что это означает, что наблюдатель просматривает сетевой ресурс, сопоставленный с другим компьютером, а не то, что просматриваемый каталог сам является сетевым ресурсом на том же компьютере, на котором работает служба. Возможно, латентность является фактором некоторых моих промахов, но даже локально компонент, похоже, не распознает имена многоточечных файлов.
Поскольку это сервис, у нас уже был метод обнаружения любых файлов, уже присутствующих при запуске службы. Этот метод работал и не зависел от компонента. Таким образом, самым элегантным решением было просто поставить этот код на таймер. Ниже приведены соответствующие части класса (т. Е. Этот фрагмент не предназначен для копирования/вставки, только для того, чтобы показать, как я решил проблему). Не позволяйте прокси-серверу FTP отказаться от курса - на самом деле это просто просмотр общей папки, которая может отображаться или не отображаться на FTP-сервере.
using System.Collections.Generic;
using Timer = System.Timers.Timer;
public partial class VsiFtpManager : ServiceBase
{
private Timer _searchTimer;
private Queue<string> _filesToProcess;
private string _ftpRoot; //this is set elsewhere from the registry
protected override void OnStart(string[] args)
{
//process any files that are already there when the service starts
LoadExistingFtpFiles();
//Handle new files
_searchTimer = new Timer(10000);
_searchTimer.Elapsed += LoadExistingFtpFiles;
}
//convenience overload to allow this to handle timer events
private void LoadExistingFtpFiles(object source, ElapsedEventArgs evtArgs)
{
LoadExistingFtpFiles();
}
private void LoadExistingFtpFiles()
{
_searchTimer.Stop();
var di = new DirectoryInfo(_ftpRoot);
FileInfo[] fileInfos = di.GetFiles("*.*", SearchOption.AllDirectories);
foreach (FileInfo fi in fileInfos.Where(fi => fi != null))
{
if (fi.Extension != "processed" && !_filesToProcess.Contains(fi.FullName))
{
LogHelper.BroadcastLogMessage("INFO: File " + fi.Name + " was uploaded.", EventLogEntryType.Information);
_filesToProcess.Enqueue(fi.FullName);
LogHelper.BroadcastLogMessage("File received: " + fi.Name, EventLogEntryType.Information);
}
}
_searchTimer.Start();
}
}
Часть вы не видите, что выходит за рамки моего вопроса, по существу сопрограмма работает против _filesToProcess очереди, которая обрабатывает файлы переименовывает их иметь расширение .processed.
Итак, мой окончательный ответ: мои исследования, проведенные с помощью автоматизированного регрессионного тестирования, показали, что наблюдатель файловой системы был ненадежным для моего использования, что требует от меня обработки файлов, скопированных в папку. Некоторые из этих файлов будут поступать из Unix-систем, и поэтому могут иметь имена файлов без окон. Компонент наблюдателя файловой системы, отправляющий с .net, не может надежно обнаруживать имена файлов стиля unix с несколькими точками внутри имени.
Я заменил наблюдателя файловой системы простым механизмом опроса. Выполнение значительно медленнее, но надежнее, что является моей главной целью. Общее решение уменьшило мои строки кода, хотя и незначительно, и удалило мой единственный компонент на поверхности дизайна сервиса, оба из которых я считаю бонусами из-за моих собственных, возможно, особых предпочтений.
Можете ли вы показать соответствующий код? Кроме того, см. [Docs] (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.filter (v = vs.110) .aspx): _ «Чтобы просмотреть изменения в ** все files **, установите свойство Filter в пустую строку (""). "_, хотя позже утверждается, что" "и" '*. *' "наблюдают за всеми файлами. – CodeCaster
Когда вы говорите: «У меня есть служба Windows C# для просмотра папки», вы имеете в виду, что это программа, которую кто-то написал, или вы ее написали? Если вы его написали, вы можете опубликовать часть своего кода. Также, что вы понимаете под «наблюдением» папки? – TheBlindSpring
Я написал это. Проводка кода не имеет значения - я пытаюсь выяснить, как запустить событие, а не отлаживать содержимое обработчика метода, которое создается визуальной студией. Я консультировался с документацией по классу наблюдателей файловой системы и не покрывал ничего о расширениях, отличных от Windows, - он просто говорит, что звезда-звезда или пустая строка (которая автоматически заполняет звезду-звезду в инспекторе) охватывает все файлы, но она, очевидно, т. –