0

私はまだ C# の初心者であり、DateTime.Now を毎秒書き込むテスト プログラムを作成しています。私はこれを使ってみましたが、うまくいきました:

StreamWriter sw = new StreamWriter("D:\Hello.txt", true);
sw.WriteLine(DateTime.Now);
sw.Close();

しかし、FileStream をインクルードしようとすると、うまくいきませんでした。問題に見えるのは?これが私のコードです:

FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(DateTime.Now);
sw.Close();
fs.Close();

注:私はタイマーを使用しています.毎秒コードを実行します..

更新:コード(ファイルストリームを持つもの)をボタン内に配置しようとしました(タイマーなし)。ボタンをクリックすると、テキスト ファイルの行が置き換えられます。これは、テキスト ファイルにテキストを追加するコードです。 StreamWriter sw = new StreamWriter("D:\Hello.txt", true);

ファイルストリームでそれを行うにはどうすればよいですか? FileAccess を書き込み専用にする必要があるため、FileStream で FileMode.Append を使用できません。

4

7 に答える 7

1

コードを毎秒実行しているため、ファイルがロック状態のままになり、ファイルストリームがハンドルの取得に失敗することがあるため、毎回作成FileStreamしてオブジェクトを作成することはお勧めできません。StreamWriter

単一のファイルに書き込んでいるので、コンストラクターで aFileStreamとそれに続くものを初期化するのは良いことですがStreamWriter、それらへの参照をクラススコープに残します。次に、スレッドで毎秒呼び出すとsw.WriteLine(DateTime.Now);役立ちます。

さらに、ファイルストリームを見逃すことはありませんtry catch。それらは矛盾を見つけるのに大いに役立ちます。

于 2012-08-23T06:32:12.133 に答える
0

StreamWriter.Flush()前に電話してみてくださいStreamWriter.Close()

于 2012-08-23T06:26:15.677 に答える
0

ファイルを使おうとしてもいいですか?

File.AppendAllText(@"D:\Hello.txt", DateTime.Now.ToString());

また

File.WriteAllText(@"D:\Hello.txt", DateTime.Now.ToString());

上書きする

于 2012-08-23T06:26:25.457 に答える
0

動作するはずです:

FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(DateTime.Now);
sw.Flush();
sw.Close();
fs.Close();
于 2012-08-23T06:35:34.257 に答える
0

私にとってはうまくいくので、このようなものを使用する必要があります。うまくいかない場合は、詳細を追加する必要があります

        using (var fs = new FileStream("path", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
        {
            fs.Seek(0, SeekOrigin.End);
            using (StreamWriter sw = new StreamWriter(fs) { AutoFlush = true })
            {
                sw.WriteLine("my text");
            }
        }

ただし、毎秒作成するわけではないことを忘れないでください。Timer.Start を呼び出すときに、Streamwriter オブジェクトをフィールドとして保存しないのはなぜですか? したがって、毎秒作成する必要はありません。(タイマーを止めたら捨てるのを忘れないでください)

于 2012-08-23T06:32:52.167 に答える
0

私はすでにそれを解決しました.. :)ファイルストリームの引数としてFileMode.Append、FileAccess.Writeを使用するだけです。FileMode.Append を先に実行しない理由は、FileAccess を書き込み専用にする必要があるためです。FileAcess を Write only に切り替えると、ユーザーがファイルを読み取れなくなると思いました。私はとても愚かです..これは私のコードです:

private void timer1_Tick(object sender, EventArgs e)
    {

        FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
        StreamWriter sw = new StreamWriter(fs);
        sw.WriteLine(DateTime.Now);
        lbTimer.Items.Add(DateTime.Now);
        sw.Close();
        fs.Close();

    }

最後の質問ですが、FileAccess を読み取り可能な場合にのみ書き込みに設定するのは何ですか?

于 2012-08-23T06:46:18.007 に答える
-1

あなたはここを見たいかもしれません

方法: テキスト ファイルに書き込む (C# プログラミング ガイド)

http://msdn.microsoft.com/en-us/library/8bh11f1k.aspx

于 2012-08-23T06:08:24.337 に答える