24

StreamReaderは、テキストファイルの読み取り中にテキストファイルをロックします。
StreamReaderを「読み取り専用」または「非ロック」モードで動作させることはできますか?

私の回避策は、ファイルを一時的な場所にコピーしてそこから読み取ることですが、可能であればStreamReaderを直接使用することをお勧めします。代替案はありますか?

背景:
ログファイルからいくつかの統計情報を取得するための小さなアプリを作成しました。このファイルは、外部プログラムによって常に(1秒間に数回)更新されており、AAXXYYを呼び出すことができます。

出力を確認すると、アプリがファイルをロックしてAAXXYYの書き込みを妨げている可能性があります。

これが私がしていることです

    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;
    }
4

2 に答える 2

51

FileStreamをStreamReaderに渡し、適切なFileShare値を使用してFileStreamを作成できます。例えば:

using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var reader = new StreamReader (file, Encoding.Unicode)) {
}
于 2009-10-22T10:40:10.197 に答える
6

コンテキストを追加すると思いますが、StreamReaderは、ファイルが読み取られているときに書き込み専用にファイルを読み取るためにファイルをロックしません。StreamReaderクラスの以下のコードを見てください。

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

MSDNhttp://msdn.microsoft.com/en-us/library/system.io.fileshare.aspxで使用されるデフォルトのFileAccess.Readパラメーターに注意してください。

読み取りのためにファイルを後で開くことができます。このフラグが指定されていない場合、(このプロセスまたは別のプロセスによる)読み取りのためにファイルを開く要求は、ファイルが閉じられるまで失敗します。ただし、このフラグが指定されている場合でも、ファイルにアクセスするには追加のアクセス許可が必要になる場合があります。

再度MSDNから取得して、読み取りと書き込みを可能にするために、代わりにFileAccess.ReadWriteを使用します(Jb Evainによって提案されたように)。

読み取りまたは書き込みのためにファイルを後で開くことができます。このフラグが指定されていない場合、(このプロセスまたは別のプロセスによって)読み取りまたは書き込みのためにファイルを開く要求は、ファイルが閉じられるまで失敗します。ただし、このフラグが指定されている場合でも、ファイルにアクセスするには追加のアクセス許可が必要になる場合があります。

于 2012-10-17T13:40:50.187 に答える