2012-03-18 22 views
32

Monitoruję plik tekstowy zapisywany przez program serwera. Za każdym razem, gdy plik zostanie zmieniony, zawartość zostanie wyprowadzona do okna w moim programie.Odczytywanie pliku używanego przez inny proces

Problem polega na tym, że nie można użyć pliku w pliku, ponieważ jest to used by another process. Ustawienie Filestream z nie przyniesie żadnego pożytku, ponieważ nie mogę kontrolować procesu, który używa tego pliku.

Mogę otworzyć plik w notatniku. Dostęp do niego musi być możliwy, nawet jeśli serwer go używa.

Czy istnieje dobry sposób obejścia tego?

Czy powinienem wykonać następujące czynności?

  1. Monitorować plik
  2. Wykonaj kopię temp od niego, gdy zmienia
  3. Czytaj kopię temp
  4. Usuń kopię temp.

Potrzebuję uzyskać tekst w pliku, gdy serwer go zmienia.

Odpowiedz

67

Jeśli notatnik może odczytać plik, to możesz, oczywiście, program nie ustawił blokady odczytu na tym pliku. Problem polega na tym, że StreamReader otworzy plik przy pomocy FileShare.Read. Który neguje dostęp do zapisu. To nie może działać, drugi program już uzyskał dostęp do zapisu.

Musisz utworzyć StreamReader tak:

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
using (var sr = new StreamReader(fs, Encoding.Default)) { 
    // read the stream 
    //... 
} 

odgadywanie na Kodowanie tutaj. Musisz być ostrożnym z tego rodzaju kodem, drugi program aktywnie zapisuje do pliku. Nie dostaniesz wiarygodnego wskazania końca pliku, uzyskanie częściowej ostatniej linii jest całkiem możliwe. Jest to szczególnie kłopotliwe, gdy czytasz plik, aby spróbować uzyskać dołączony program.

+2

Dziękuję ... Nie wiedziałem, że FileShare.Read będzie w tym przypadku niepoprawny. –

+2

Używając 'FileShare.ReadWrite | FileShare.Delete' można uzyskać dostęp do jeszcze większej liczby plików. Warto spróbować, gdy 'FileShare.ReadWrite' nie wystarcza – Adassko

+0

@Adassko Lub gdy' FileShare.Read' to za mało, tak jak w tym przypadku, i w mojej szczególnej sytuacji, w której używałem tego w tym samym kodzie i musiał przejść na 'FileShare.ReadWrite', aby uruchomić go. – vapcguy

10

połączeń

File.Open(path, FileMode.Read, FileAccess.Read, FileShare.ReadWrite) 

to powinno działać tak długo, jak inna aplikacja nie została zablokowana wyłącznie plik.

+0

Dziękuję. Czy to działa w połączeniu z czytnikiem strumienia? W ten sposób: File.Open (ścieżka, FileMode.Read, FileAccess.Read, FileShare.ReadWrite); Czytnik StreamReader = nowy StreamReader (ścieżka); – Christoffer

+0

@ Oczywiście: Oczywiście. IIRC, ctor "StreamReadera" może również pobierać te parametry bezpośrednio. – SLaks

+0

Jak to wyglądałoby? Jeśli ustawię FileMode.Open, FileAccess.Read, FileShare.ReadWrite jako parametry w Streamreaderze, to nie zadziała. Mówi, że wymaga tylko jakiegoś parametru kodowania. – Christoffer

Powiązane problemy