我已经创建了一个C#windows应用程序项目..在这里我需要在一个新的文本文件中添加一些文本,我应该在按钮点击时创建该文件。所以当我点击按钮时,我应该创建一个文本文件,应该有我使用控件给出的文本..但我的问题是当我点击按钮,它创建新文件,并在文件中写入文本时,它遇到了一些问题," 该进程无法访问该文件' D:\ MyWork \ DemoEpub \ 98989.txt'因为它被另一个进程使用。"我已经给出了以下代码..请帮我解决此错误
private void Create_Click(object sender, EventArgs e)
{
FileStream fs = null;
string fileLoc = @"D:\MyWork\DemoEpub\" + textBox1.Text + ".txt";
if (!File.Exists(fileLoc))
{
using (fs = File.Create(fileLoc))
{
if (File.Exists(fileLoc))
{
using (StreamWriter sw = new StreamWriter(fileLoc))
{
try
{
sw.Write("<START>\n<TITLE>" + textBox1.Text + "</TITLE>\n<BODY>\n<P>PAGE " + textBox2.Text + "</P>\n<P>\n" + richTextBox1.Text + "</P>\n</BODY>\n<END>");
}
catch(System.IO.IOException exp)
{
sw.Close();
}
}
}
}
}
}
答案 0 :(得分:4)
File.Create已经创建并打开了该文件。它返回一个Stream对象,该文件使文件保持打开并锁定,直到此Stream对象被关闭/处理。
将 StreamReader 构造函数与字符串路径一起使用将使 StreamReader 再次尝试打开该文件,由于上述原因,该文件将失败
要利用已经Stream对象 fs (已经打开并锁定文件),只需将其传递给 StreamReader 的构造函数:
string fileLoc = @"D:\MyWork\DemoEpub\" + textBox1.Text + ".txt";
if (!File.Exists(fileLoc))
{
using (Stream fs = File.Create(fileLoc))
using (StreamWriter sw = new StreamWriter(fs))
{
...
}
}
另请注意,在获取 fs 后,您无需再执行第二次 File.Exists()检查。从 File.Create()获取有效的Stream对象意味着该文件已成功创建。如果无法创建文件, File.Create()会抛出异常。
另一种方法是直接将 StreamWriter 与给定的字符串路径一起使用(而不是单独创建 Stream 对象):
string fileLoc = @"D:\MyWork\DemoEpub\" + textBox1.Text + ".txt";
if (!File.Exists(fileLoc))
{
using (StreamWriter sw = new StreamWriter(fileLoc))
{
...
}
}
最后,作为旁注,我想指出,如果使用 using 语句,则不需要在异常处理程序中显式关闭StreamReader或Stream对象。当程序离开使用语句的范围时, using 将负责处理(包括关闭)作为其参数提供的StreamReader或Stream对象。有关使用的更多详细信息,请参阅MSDN documentation。
答案 1 :(得分:0)
示例中的using语句打开并准备文件。在陈述结束时,他们关闭并处置资源。如果您的程序执行大量写操作,则在使用时将正确管理系统资源。
在此示例中,StreamWriter会为您创建文件并关闭文件,因此您无需编写关闭函数。 Catch是记录您的错误。
private void Create_Click(object sender, EventArgs e)
{
string fileLoc = @"D:\MyWork\DemoEpub\" + textBox1.Text + ".txt";
if (!File.Exists(fileLoc))
{
using (StreamWriter sw = new StreamWriter(fileLoc))
{
try
{
sw.Write("<START>\n<TITLE>" + textBox1.Text + "</TITLE>\n<BODY>\n<P>PAGE " + textBox2.Text + "</P>\n<P>\n" + richTextBox1.Text + "</P>\n</BODY>\n<END>");
}
catch(System.IO.IOException exp)
{
//Catch your error here.
}
}
}
}