StreamReader blokuje plik tekstowy podczas jego odczytu.
Czy mogę zmusić StreamReader do pracy w trybie "tylko do odczytu" lub "bez blokowania"?Czy mogę zapobiec blokowaniu pliku tekstowego przez StreamReader, gdy jest on używany?
Moje obejście polegałoby na skopiowaniu pliku do lokalizacji tymczasowej i przeczytaniu go z tego miejsca, ale wolałbym bezpośrednio użyć StreamReader, jeśli to możliwe. Jakieś alternatywne sugestie?
Tło:
Napisałem małą aplikację, aby pobrać statystyki z pliku dziennika. Ten plik jest ciągle aktualizowany (kilka razy na sekundę) przez program zewnętrzny umożliwiający wywołanie AAXXYY.
Przeglądanie wyników sugeruje, że moja aplikacja może blokować plik i uniemożliwić pisanie AAXXYY.
To co robię
private void btnGetStats_Click(object sender, EventArgs e)
{
int countStarts = 0;
int countEnds = 0;
IList<string> sessions = new List<string>();
using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode))
{
while(!stRead.EndOfStream)
{
string line = stRead.ReadLine();
if(line.Contains("Session start"))
{
countStarts++;
sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
}
if (line.Contains("Session end"))
{
countEnds++;
sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
}
}
}
txtStarts.Text = countStarts.ToString();
txtEnds.Text = countEnds.ToString();
txtDifference.Text = (countStarts - countEnds).ToString();
listBox1.DataSource = sessions;
}
+1 to działa ładnie. Dziękuję Ci. Chociaż musiałem zamienić "var" na FileStream i StreamReader. Do czego zmierzyć var? Czy to VB? Myślę, że ta odpowiedź powinna być edytowana, aby zmienić te, ale nie mam przedstawiciela, aby to zrobić samodzielnie. –
O słowach kluczowych "var", zobacz ten link: http://msdn.microsoft.com/en-us/library/bb383973 .aspx. To słowo kluczowe jest nowe w C# 3.0+. – pyrocumulus
Aha. Chmurka dzięki. Odpowiada mi za pracę w ciemnych wiekach. Wstyd Nie mogę dać +1 komentarzowi :-) –