2014-11-10 2 views
-1

У меня есть служба Windows C#, просматривающая папку. Кажется, что если файлы создаются с использованием традиционной структуры имен файлов Windows, все в порядке, например. foo.zip. Но затем идет один из тех, кто надоедливый unix, который называет свои файлы: foo.bar.11-10-2013.zip.FileSystemWatcher, кажется, игнорирует несколько точек в именах файлов

File Watcher в моей программе никогда не видит этот файл. Фильтр не установлен, поэтому он по умолчанию равен *.*.

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

Я пробовал найти ответ, но другой проблемой я не уверен, как сформулировать вопрос - называем ли мы его несколькими расширениями или несколькими точками или несколькими периодами? Все они вернули бесполезные результаты.

Итак, мой вопрос: возможно ли настроить наблюдателя файлов для обнаружения имен файлов стиля Linux с несколькими расширениями точек на нем? И если вам известен официальный термин для «многоточечных расширений файлов», мне бы хотелось узнать, что они называются.

+4

Можете ли вы показать соответствующий код? Кроме того, см. [Docs] (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.filter (v = vs.110) .aspx): _ «Чтобы просмотреть изменения в ** все files **, установите свойство Filter в пустую строку (""). "_, хотя позже утверждается, что" "и" '*. *' "наблюдают за всеми файлами. – CodeCaster

+0

Когда вы говорите: «У меня есть служба Windows C# для просмотра папки», вы имеете в виду, что это программа, которую кто-то написал, или вы ее написали? Если вы его написали, вы можете опубликовать часть своего кода. Также, что вы понимаете под «наблюдением» папки? – TheBlindSpring

+0

Я написал это. Проводка кода не имеет значения - я пытаюсь выяснить, как запустить событие, а не отлаживать содержимое обработчика метода, которое создается визуальной студией. Я консультировался с документацией по классу наблюдателей файловой системы и не покрывал ничего о расширениях, отличных от Windows, - он просто говорит, что звезда-звезда или пустая строка (которая автоматически заполняет звезду-звезду в инспекторе) охватывает все файлы, но она, очевидно, т. –

ответ

0

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

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

Я изменил событие, чтобы обнаружить изменения, и я отфильтровывал размер. Кажется, что . исключает расширение файлов с несколькими точками и почему бы и нет? foo.bar.blah.zip не соответствует . рисунок. Нам нужны ant-like дескрипторы шаблонов файлов (поскольку никто не предлагал лучшего термина :-), но они, похоже, не поддерживаются через документацию.

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

+0

посмотреть это сообщение Я пропустил ваш вопрос выглядит как кто-то еще на StackOverflow.com просил что-то подобное http://stackoverflow.com/questions/11306302/filesystemwatcher-with-samba-on-linux – MethodMan

+0

Спасибо. Это было полезно, но не совсем моя проблема. Кажется, они контролировали долю, а я нет. На самом деле у них появилось сообщение об ошибке (полезно), но я этого не делаю - обработчики событий просто не срабатывают, мы пропускаем файлы обработки, а мой босс становится неуклюжим. НО, это заставило меня подумать о проблеме немного по-другому, и у меня есть простой способ учесть любые недостающие события, теперь, когда они на самом деле стреляют, мне просто нужно вызывать его периодически. –

+0

Звучит неплохо. Попробуйте реорганизовать его, не используя полную функциональность. Мне любопытно узнать, что будет с окончательной работой. Так как я использую это только в системе Windows. – MethodMan

0

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

Поскольку это сервис, у нас уже был метод обнаружения любых файлов, уже присутствующих при запуске службы. Этот метод работал и не зависел от компонента. Таким образом, самым элегантным решением было просто поставить этот код на таймер. Ниже приведены соответствующие части класса (т. Е. Этот фрагмент не предназначен для копирования/вставки, только для того, чтобы показать, как я решил проблему). Не позволяйте прокси-серверу 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 с несколькими точками внутри имени.

Я заменил наблюдателя файловой системы простым механизмом опроса. Выполнение значительно медленнее, но надежнее, что является моей главной целью. Общее решение уменьшило мои строки кода, хотя и незначительно, и удалило мой единственный компонент на поверхности дизайна сервиса, оба из которых я считаю бонусами из-за моих собственных, возможно, особых предпочтений.

 Смежные вопросы

  • Нет связанных вопросов^_^