如何使用C#windows应用程序添加文本文件创建文本?

时间:2014-05-16 18:11:40

标签: c#

我已经创建了一个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();
                            }
                        }
                    }
                }
            }
        }

2 个答案:

答案 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.
                    }
           }
    }
}