2008-09-21 15 views
6

Buduję aplikację C#, która będzie monitorować określony katalog pod kątem zmian i uzupełnień oraz przechowywania informacji w bazie danych.Monitorowanie modyfikacji katalogu

Chciałbym uniknąć sprawdzania poszczególnych plików pod kątem modyfikacji, ale nie jestem pewien, czy mogę całkowicie zaufać czasowi dostępu do pliku.

Jaka byłaby najlepsza metoda uzyskiwania ostatnio zmodyfikowanych plików w katalogu?

Sprawdzałby modyfikacje tylko wtedy, gdy użytkownik o to poprosi, nie będzie to usługa stale uruchomiona.

+0

Czy masz zawsze działającą usługę, czy też chcesz, aby program pobierał ostatnio zmodyfikowane pliki przy każdym uruchomieniu bez ciągłego monitorowania systemu plików? Proszę, wyjaśnij pytanie. –

Odpowiedz

1

Hmm ... ciekawe pytanie. Na początku chciałbym wskazać ci klasę FileSystemWatcher. Jeśli jednak chcesz, aby to działało, na żądanie użytkownika, może się zdarzyć, że będziesz musiał najpierw zapisać informacje o katalogu, a następnie porównać je za każdym razem, gdy użytkownik tego zażąda. Prawdopodobnie pójdę z FileSystemWatcher i po prostu zapiszę twoje wyniki.

6

Użyj obiektu FileSystemWatcher. Oto kod do zrobienia tego, czego szukasz.

 
    // Declares the FileSystemWatcher object 
    FileSystemWatcher watcher = new FileSystemWatcher(); 

    // We have to specify the path which has to monitor 

    watcher.Path = @"\\somefilepath";  

    // This property specifies which are the events to be monitored 
    watcher.NotifyFilter = NotifyFilters.LastAccess | 
     NotifyFilters.LastWrite | NotifyFilters.FileName | notifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; // Only watch text files. 

    // Add event handlers for specific change events... 

    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.Created += new FileSystemEventHandler(OnChanged); 
    watcher.Deleted += new FileSystemEventHandler(OnChanged); 
    watcher.Renamed += new RenamedEventHandler(OnRenamed); 
    // Begin watching. 
    watcher.EnableRaisingEvents = true; 


    // Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e) 
    { 
    // Specify what is done when a file is changed, created, or deleted. 
    } 

    private static void OnRenamed(object source, RenamedEventArgs e) 
    { 
    // Specify what is done when a file is renamed. 
    } 
1

Jeśli tylko trzeba to sprawdzić, kiedy użytkownik pyta, a następnie przez cały czas, nie używać FileSystemWatcher. Zwłaszcza jeśli jest to zasób współużytkowany - ostatnią rzeczą, jakiej oczekujesz, jest to, że 50 komputerów klienckich obserwuje ten sam udostępniony katalog.

To prawdopodobnie tylko literówka, ale nie powinieneś patrzeć na czas dostępu do pliku, chcesz spojrzeć na czas modyfikacji pliku, aby odebrać zmiany. Nawet to nie jest niezawodne.

To, co mógłbym zrobić, to zaimplementować jakąś funkcję sumy kontrolnej w dacie i rozmiarze pliku lub innych właściwościach systemu plików. W ten sposób nie będę szukał zmian w całym pliku - tylko jego właściwości i ja możemy to zrobić na żądanie, zamiast próbować utrzymywać połączenie ze zdalnym zasobem, aby go monitorować.

Cięższym rozwiązaniem byłoby zrobienie tego na odwrót i zainstalowanie usługi na komputerze udostępniającym współużytkowany napęd, który mógłby monitorować pliki i zanotować zmiany. Wtedy możesz zapytać usługę, zamiast dotykać plików - ale to prawdopodobnie przesada.