Frage

Die Stream sperrt eine Textdatei, während sie es liest.
Kann ich die Stream zwingen in einem „read-only“ oder „nicht locking“ Modus zu arbeiten?

Meine Abhilfe wäre die Datei in ein temporäres Verzeichnis zu kopieren und von dort lesen, aber ich würde es vorziehen, die Stream direkt zu verwenden, wenn möglich. Abweichenden suggetions?

Hintergrund:
Ich habe eine kleine Anwendung geschrieben einige Statistiken aus einer Protokolldatei zu erhalten. Diese Datei wird ständig aktualisieren (mehrmals pro Sekunde) von einem externen Programm kann Anruf AAXXYY.

die Ausgabe Überprüfung schlägt vor, dass meine Anwendung die Datei wird Verriegelung kann und verhindert AAXXYY vom Schreiben.

Das ist, was ich tue

    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;
    }
War es hilfreich?

Lösung

Sie können eine Filestream zum Stream, übergeben und das Filestream mit dem richtigen Fileshare Wert schaffen. Zum Beispiel:

using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var reader = new StreamReader (file, Encoding.Unicode)) {
}

Andere Tipps

Dachte, ich etwas Kontext hinzufügen würde, Stream nicht eine Datei sperren zum Lesen nur für das Schreiben Whist es gelesen wird. Werfen Sie einen Blick auf den Code unten aus der Klasse Stream.

 new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan);

Beachten Sie die Standard FileAccess.Read Parameter für MSDN genommen http: //msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

  

Ermöglicht anschließende Öffnen der Datei zum Lesen. Wenn dieser Flag nicht angegeben ist, wird jede Anforderung die Datei öffnen zum Lesen (durch diesen Prozess oder einen anderen Prozess) schlagen fehl, bis die Datei geschlossen wird. Doch selbst wenn dieser Flag angegeben ist, könnten zusätzliche Berechtigungen noch benötigt werden, um die Datei zuzugreifen.

Auch von MSDN genommen Lesen zu ermöglichen, und das Schreiben Verwendung FileAccess.ReadWrite statt (wie von Jb Evain vorgeschlagen).

  

Ermöglicht anschließende Öffnen der Datei zum Lesen oder Schreiben. wenn diese   Flag nicht angegeben ist, jede Anforderung die Datei zum Lesen zu öffnen oder   (Durch diesen Prozess oder einem anderen Prozess) schreiben wird, bis die Datei fehlschlagen   ist geschlossen. Doch selbst wenn dieses Flag angegeben ist, zusätzliche   Berechtigungen möglicherweise noch benötigt werden, um die Datei zuzugreifen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top