我应该在哪里关闭文件流?

时间:2018-02-02 15:20:19

标签: c# .net file

我试图在C#(config)中获取文件的文本并将其放入字段中。代码本身可以工作,但我需要关闭文件流以在代码中打开一个新的文件流,但不知道在哪里放置Close()标记。有人能帮助我吗?

string documentspath = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string rpath = documentspath + @"\Luminous\remember.ini";
if (File.Exists(rpath))
{
    try
    {
        string text = File.ReadAllText(rpath);
        string path = text.Split('|')[0];
        string process = text.Split('|')[1];

        string loadLib = text.Split('|')[2];

        pathBox.Text = path;
        processBox.Text = process;
        if (loadLib == "True")
        {
            loadLibrary.Checked = true;
        }
        else
        {
            manualMap.Checked = true;
        }
    } catch
    {
        MessageBox.Show("Config file corrupted. Remembered data has been lost and deleted.");
        File.Delete(rpath);
    }
} else
{
    MessageBox.Show("No config file loaded. Welcome, " + Environment.UserName + ".");
}

编辑:这是我打开另一个文件流的代码。

string documentspath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
if (!Directory.Exists(documentspath + @"\Luminous")) {
    Directory.CreateDirectory(documentspath + @"\Luminous");
} else {
    string rpath = documentspath + @"\Luminous\remember.ini";
    if (!File.Exists(rpath)) {
        File.Create(rpath);
        File.WriteAllText(rpath, pathBox.Text + "|" + processBox.Text + "|" + loadlibcheck + "|" + manualmapcheck);
    } else {
            File.WriteAllText(rpath, string.Empty);
            File.WriteAllText(rpath, pathBox.Text + "|" + processBox.Text + "|" + loadlibcheck + "|" + manualmapcheck);
    }
}

4 个答案:

答案 0 :(得分:8)

使用File时,您无需关闭File.ReadAllText()

来自MSDN

  

File.ReadAllText方法打开文本文件,读取文件的所有行,然后关闭文件。

答案 1 :(得分:5)

由于以下行而出现错误:

File.Create(rpath);

尝试:

using(File.Create(rpath)) {}

File.Create方法实际返回FileStream,必须将其处理掉。有关它的一些信息可以在documentation上找到。

在“返回值”部分中:

  

类型:System.IO.FileStream提供读/写的FileStream   访问路径中指定的文件。

在“备注”部分:

  

此方法创建的FileStream对象的默认FileShare值为None;在原始文件句柄关闭之前,没有其他进程或代码可以访问创建的文件。

但是,正如Chris Dunaway提到的那样,根据documentation File.Create的说明,根本不需要使用WriteAllText

  

创建新文件,将指定的字符串写入文件,然后关闭该文件。如果目标文件已存在,则会被覆盖。

答案 2 :(得分:3)

您有两个不错的选择:

  1. finally区块的try/catch条款中。
  2. 将代码更改为使用using语句作为文件流。

答案 3 :(得分:0)

你不必关闭任何东西。 File.ReadAllText在内部读取和关闭流。因此,如果需要,您可以安全地调用另一个File.ReadAllText