2010-10-20 23 views
8

Mam zamiar utworzyć aplikację, która będzie oglądać katalog dla wszystkich plików utworzonych. dość prosty czas na użycie systemu plików. Moje pytanie dotyczy tego, jak go wykorzystać. Czy powszechną praktyką jest korzystanie z usługi Windows w celu zapewnienia, że ​​aplikacja zawsze działa?fileystemwatcher jako usługa Windows?

Próbuję uciec od budowania usług windowsowych, jeśli nie muszę, ale naprawdę nie widzę alternatywy dla robienia tego w ten sposób w tym przypadku. Zwykle chciałbym przekonwertować moją usługę na aplikację konsolową i zaplanować ją przy użyciu programu do planowania systemu Windows, ale tak naprawdę nie ma to zastosowania w tej sytuacji.

Czy ktoś może polecić lepszy sposób implementacji systemu plików zamiast usługi Windows?

dzięki za wszelkie myśli.

EDIT w odpowiedzi na komentarzach poniżej, bardziej szczegółowo, po prostu trzeba obejrzeć katalog na serwerze, a gdy tworzony jest nowy plik, muszę przenieść kopię tego pliku do inny katalog na tym samym serwerze, być może zmieniając nazwę w tym procesie.

Częstotliwość i ilość plików będzie niewielka. być może 5-10 najwyżej na jeden dzień.

+1

Być może zaimplementuj usługę w języku/środowisku wykonawczym wymagającym mniej pamięci i uruchom program C# tylko po znalezieniu nowego pliku. – CodesInChaos

+1

@CodeInChaos - niezbyt świetny pomysł. Wdrożenie natywnej funkcji FSW jest o wiele trudniejsze, podobnie jak komplikacja związana z rozwiązaniem z dwoma procesami. Myślałem, że minęliśmy stereotypy dotyczące zarządzanego kodu? –

+1

Naprawdę, CodeInChaos? Jestem za wydajnością, ale nie jestem pewien, czy twój komentarz jest szczególnie konstruktywny, i na pewno nie chcę być tym, który wykopałby czyjś kod później, gdzie dokonano zmiany języków dla różnych części projektu. (Mówiąc to, myślę, że wszyscy robimy to często ...) – Brad

Odpowiedz

2

Powinieneś opisać więcej na temat tego, co chcesz zrobić, ale zazwyczaj, jeśli masz coś, co musi działać w tle i nie wymaga bezpośredniej interakcji użytkownika, usługa często ma sens.

Możesz użyć usługi Remoting, aby podłączyć front-end do swojej usługi w razie potrzeby.

+2

Bardzo prawdziwe, chociaż WCF jest lepszym rozwiązaniem niż Remoting, który został w tym momencie przestarzały. –

+0

Oh super ... naprawdę !? Wow, zainwestowałem dużo czasu, ostatnio zastanawiając się nad Remotem i wszystkimi jego bzdurami. :-D No cóż ... Myślę, że pójdę teraz naucz się WCF. – Brad

+0

WCF jest całkiem niezły i przyzwoicie łatwy do odbioru. Możesz łatwo zmienić funkcjonalność za pomocą konfiguracji – jlafay

1

Tak, użyj usługi dla tego rodzaju operacji, ale don'tusefilesystemwatcher. Jeśli odpytujesz pliki w swojej usłudze, albo dont use klasa Timer.

Sprawdź, czy plik został wypełniony i nie jest już zablokowany przed próbą przeniesienia.

To trywialne do odpytywania dla zmian w plikach (składnia może być wyłączona) i eliminuje wiele dodatkowych programów związanych ze zdarzeniami obserwatora systemu plików.

While True 'or your exit condition' 
Dim _files() as FileInfo = Directory.GetFiles(yourTargetDirectory) 
For Each _file as FileInfo In _files 
    If _file.LastModifiedDate < DateTime.Now.AddMinutes(1) Then 
    'move your files' 
    End If 
Next 

End While 
+0

, którą polecasz jako alternatywę dla systemu plików. – czuroski

+0

Jedyną alternatywą, która nie jest odpytywaniem, jest 'ReadDirectoryChangesW' - o wiele trudniej to uzyskać i te same problemy z niezawodnością. –

+0

Do tej pory miałem szczęście z tym otworem FileSystemWatcher ... ukrywa kilka brodawek. http://www.codeproject.com/KB/cs/EnhancedFileSysWatcher.aspx – kenny

0

Korzystanie z usługi Windows zawinąć FileSystemWatcher jest w porządku za to, co trzeba.

FSW to właściwe narzędzie do pracy (natywny kod do oglądania systemu plików to niedźwiedź, aby uzyskać prawo), a usługa jest właściwym mechanizmem do wdrożenia go, ponieważ potrzebna jest operacja "zawsze włączona".

Poświadczenia usługi będą niezależne od zalogowanego użytkownika, co może być przydatne.

+0

Nie można nie zgodzić się więcej na temat FSW. Okazało się niewiarygodne w kilku sytuacjach. Usunięcie go i zastąpienie przez mechanisim ankietowania (zarządzany nie Win32) rozwiązało wszystkie problemy. – StingyJack

3

Nie jestem jeszcze pewien, jak działa moduł do śledzenia plików, ale myślę tak: system plików uruchamia zdarzenia; Mam na myśli to, że musi to robić NTFS. Twój obserwator plików przechwytuje te zdarzenia. Obserwator plików prawdopodobnie zawiesza wątek, w którym działa, dopóki nie nastąpi zdarzenie, a zdarzenie w jakiś sposób budzi wątek. Zawieszony wątek używa prawie bardzo niewielu cykli procesora (właściwie żadnego) podczas jego zawieszania, więc oczekiwanie na wydarzenie plików nic nie kosztuje. Tak więc ankietowane podejście marnuje dużo na beaucoup (to jest francuski, to znaczy "ładunek gówna") cykli procesora, ale plik nie działa. Prawdopodobnie możesz spojrzeć na PerfMon, aby sprawdzić, czy to prawda.

Powiązane problemy