C# 无法使用C中的计时器写入文本文件#
我仍然是C#的新手,我正在制作一个测试程序来编写日期时间。现在每秒钟。我试着用了这个,它成功了:C# 无法使用C中的计时器写入文本文件#,c#,timer,filestream,streamwriter,C#,Timer,Filestream,Streamwriter,我仍然是C#的新手,我正在制作一个测试程序来编写日期时间。现在每秒钟。我试着用了这个,它成功了: StreamWriter sw = new StreamWriter("D:\Hello.txt", true); sw.WriteLine(DateTime.Now); sw.Close(); 然而,当我尝试包含一个文件流时,它不起作用。有什么问题吗?这是我的密码: FileStream fs = new FileStream(@"D:\Hello.txt", FileMode.OpenOrCr
StreamWriter sw = new StreamWriter("D:\Hello.txt", true);
sw.WriteLine(DateTime.Now);
sw.Close();
然而,当我尝试包含一个文件流时,它不起作用。有什么问题吗?这是我的密码:
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();
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();
}
注意:我使用的是计时器,它每秒执行一次代码
更新:
我试着将代码(包含文件流的代码)放在一个按钮(带out定时器)中。每当我单击按钮时,它都会替换文本文件中的行。。这是一个将文本附加到文本文件的代码:
StreamWriter sw=新的StreamWriter(“D:\Hello.txt”,true)
我将如何在文件流中执行它?我无法在FileStream中使用FileMode.Append,因为它要求文件访问权限为“仅写”。您可能需要查看此处 如何:写入文本文件(C#编程指南)
尝试调用
StreamWriter.Flush()
,然后再调用StreamWriter.Close()
是否可以尝试使用文件
File.AppendAllText(@"D:\Hello.txt", DateTime.Now.ToString());
或
要覆盖由于每秒都在执行代码,因此每次都创建
FileStream
和StreamWriter
对象不是一个好主意,因为有时文件将保持锁定状态,而FileStream将无法获取句柄
在编写单个文件时,最好在构造函数中初始化FileStream
和后续StreamWriter
,同时在类范围中将引用留给它们;然后在sw.WriteLine(DateTime.Now)的线程上每秒调用一次代码>应该有帮助
此外,千万不要错过文件流中的try catch
。它们对找出差异有很大帮助。您应该使用类似的东西,因为它对我很有用。如果它不适合你,你必须添加更多的细节
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对象存储为字段?
因此,您不必每秒钟都创建它。(当您停止计时器时,请重新启动以进行处理)应能正常工作:
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();
我已经解决了……)我只需要使用FileMode.Append、FileAccess.Write作为filestream中的参数。不执行FileMode.Append的原因是因为它需要FileAccess为只写。我认为将FileAccess切换为只写会阻止用户读取文件。我真蠢。。这是我的代码:
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();
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设置为仅在您仍然可以阅读的情况下写入?“它不起作用”太模糊了,我们无法帮助您。请提供更多细节。哦,您应该使用和语句以更可靠的方式关闭资源。请提供异常详细信息,并确保文件未打开或未被其他进程使用。我认为这与计时器无关。你不认为使用Filemode.Append更好吗…只是一个建议。@pssk-我认为如果另一个进程正在使用它,它应该会显示错误,但我会再次检查。@Ravi-我尝试设置断点,它通过编写文本的代码,但仍然没有写入文本文件。你不认为这不是一个答案,只是一个注释吗?我必须使用FileStream,因为它有我需要的filemode、fileacces和fileshare。你确定吗,它真的会在一秒钟内关闭???抓拍记录异常的快照,你会了解更多。