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);

我将如何在文件流中执行此操作?我不能在 FileStream 中使用 FileMode.Append,因为它要求 FileAccess 是只写的。

4

7 回答 7

1

由于您每秒都在执行代码,因此每次都创建FileStreamStreamWriter对象不是一个好主意,因为有时文件将保持在锁定状态并且文件流将错过获取句柄。

当您写入单个文件时,最好在构造函数中初始化 aFileStream和后续StreamWriter,同时将引用留给它们在类范围内;然后在线程上每秒调用它一次sw.WriteLine(DateTime.Now);应该会有所帮助。

并且永远不会错过try catch文件流。它们对找出差异有很大帮助。

于 2012-08-23T06:32:12.133 回答
0

我已经解决了.. :) 我只需要使用 FileMode.Append、FileAccess.Write 作为文件流中的参数。之前不做 FileMode.Append 的原因是因为它需要 FileAccess 是只写的。我认为将 FileAcess 切换为只写会阻止用户读取文件。我真愚蠢..这是我的代码:

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 回答
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

你应该使用这样的东西,因为它对我来说很好用。如果它不适合您,您必须添加更多详细信息

        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

应该管用:

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 回答
-1

你可能想看看这里

如何:写入文本文件(C# 编程指南)

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

于 2012-08-23T06:08:24.337 回答