2010-09-14 16 views
27

Mam mały problem. Mam narzędzie, które powinno codziennie parsować plik dziennika, niestety ten plik dziennika jest używany przez proces, który zapisuje do dziennika i nie mogę go zatrzymać.Jak czytasz plik, który jest w użyciu?

Pierwsza próba polegała na utworzeniu kopii pliku, który również nie działa.

Czy jest jakiś sposób, aby przeczytać bieżący tekst pliku dziennika, nawet jeśli jest już w użyciu?

+1

Jak próbowałeś to przeczytać? – jgauffin

+1

Zależy od sposobu, w jaki narzędzie otwiera plik dziennika. Jeśli jest ładny i używa FILE_SHARE_READ, możesz otworzyć plik dziennika do czytania, co sugerują inne postery; inaczej pech dla ciebie. –

Odpowiedz

63
using (FileStream stream = File.Open("path to file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     while (!reader.EndOfStream) 
     { 

     } 
    } 
} 

FileAccess określa, co użytkownik chce zrobić z plikiem. FileShare określa, co INNE mogą zrobić z plikiem, gdy jest on w użyciu.

W powyższym przykładzie można otworzyć plik do odczytu, podczas gdy inne procesy mogą mieć otwarty plik do odczytu/zapisu. W większości przypadków będzie to działać przy otwieraniu logów, które są w użyciu.

+2

+1, jedyna poprawna odpowiedź tutaj. Określanie FileShare.ReadWrite ma kluczowe znaczenie. Drugi proces już uzyskał dostęp do zapisu, nie można mu odmówić. –

+0

Dzięki, że działało idealnie! – Feroc

+0

File.OpenRead robi to wewnątrz. –

-2

Bardzo polecam BareTail, którego używamy do przeglądania wszystkich naszych dzienników w czasie rzeczywistym. Obsługuje także podświetlanie, co jest bardzo przydatne.

+0

hmmm ... wygląda na to, że OP chce programowego sposobu na odczytanie pliku, gdy jest już otwarty. = P – Dave

3

Użyj File.OpenRead(path), umożliwia to dostęp do strumienia tylko do odczytu; w ten sposób nie będziesz się martwić, jeśli inna aplikacja ma blokadę zapisu w pliku.

+1

Nie zawsze prawda, mam problem z odczytaniem zablokowanego pliku dziennika i używam File.OpenRead –

+0

File.OpenRead nie otworzy pliku, gdy inna aplikacja już go otworzyła do zapisu. Odpowiedź Toma Vervoorta jest właściwa. – Wout

1

to zależy, czy próbowałeś czytać plik tylko do odczytu? przy użyciu jednej z metod statycznych

System.IO.File.ReadAllText(path) or System.IO.File.ReadAllLines(path) 

mogą one działać, jeśli istnieje plik nie jest zablokowany wyłącznie

3

Jesteś na łasce programu, który jest pisanie plik. W systemie Windows proces może otworzyć plik do odczytu, zapisu lub obu, ale może również kontrolować, czy inne procesy mogą otworzyć plik do odczytu, zapisu lub oba. Jeśli inny proces odmówił ci prawa do odczytania zawartości pliku, nic nie możesz na to poradzić.

Jeśli kontrolujesz kod źródłowy programu, który zapisuje plik dziennika, zmień go, aby umożliwić dostęp do odczytu innym procesom.

Powiązane problemy