2011-08-10 13 views
7

Potrzebuję ciągłego odczytu pliku dziennika w celu wykrycia określonych wzorców. Jak to zrobić bez zakłócania operacji na plikach, które musi wykonać operacja zapisywania dziennika?Odczytaj plik w taki sposób, aby uniemożliwić modyfikację innych procesów.

Proces zapisywania dziennika, oprócz zapisywania logów, okresowo przenosi plik do innej lokalizacji (do osiągnięcia określonego rozmiaru).

Po odczytaniu pliku aplikacja do zapisu rejestru nie przesuwa pliku. Grałem z różnymi opcjami FileShare bez rezultatu.

Tutaj jest uproszczoną wersją mojego kodu:

using (FileStream stream = new FileStream(@"C:\temp\in.txt", FileMode.Open, FileAccess.Read, FileShare.Delete)) 
     { 
      TextReader tr = new StreamReader(stream); 
      while (true) 
      { 

       Console.WriteLine(".. " + tr.ReadLine()); 
       Thread.Sleep(1000); 
      } 

     } 
+0

"aplikacja rejestrująca zapisy w dzienniku nie przenosi pliku" - czy chcesz, aby czytnik był otwarty na przenoszonym pliku? –

+0

Chcę czytać tak długo, jak plik jest dostępny. Nie mam kontroli nad tym, kiedy/jak aplikacja rejestrująca przenosi plik. Idealnie byłoby uzyskać wyjątek, gdy plik zostanie przeniesiony i rozpocząć czytanie nowego pliku dziennika od tego punktu. – akirekadu

Odpowiedz

3

Wypróbuj FileShare.ReadWrite | FileShare.Delete.

Ale jeśli plik zostanie usunięty (przeniesiony), to myślę, że twoje czytanie się nie powiedzie.

+0

Dziękuję. Właśnie tego szukałem. – akirekadu

3

zachowujesz plik otwarty przez cały czas, a nie tylko wtedy, gdy występują zmiany do odczytania.

Myślę, że lepszym rozwiązaniem byłoby użycie pliku FileSystemWatcher do monitorowania pliku zmian, a następnie otwarcia pliku po zmianie i odczytaniu w nowych danych. Jeśli plik jest tylko dołączony, możesz śledzić, jak długo przetwarzasz plik i natychmiast szukać tej pozycji po otwarciu pliku.

+0

Jeśli jest to umiarkowany (lub bardzo) używany plik dziennika (który, jak podejrzewam, może to być), to będzie to powodować cały czas. Powiedzmy, że ten plik jest zapisywany do niego 1000 linii/sekundę ... – Joe

+0

@anders Następnie ma ten sam problem, który być może pisarz chce przenieść ten plik, gdy czytnik czyta. – Skomski

+0

Tak jak wspomniał Joe, ten plik dziennika jest stale aktualizowany. – akirekadu

Powiązane problemy