StreamReaderが使用中にテキストファイルをロックしないようにできますか?

StackOverflow https://stackoverflow.com/questions/1606349

質問

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;
    }
役に立ちましたか?

解決

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)) {
}

他のヒント

コンテキストを追加すると思いますが、StreamReaderは読み取り中にファイルを書き込み専用にロックしますしない。 StreamReaderクラスの以下のコードをご覧ください。

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

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

  

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

MSDNからの読み取りと書き込みを許可するために、FileAccess.ReadWriteを代わりに使用します(Jb Evainの提案による)。

  

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top