微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

File.ReadLines 在读取文件后保持文件锁定,我无法写入文件

如何解决File.ReadLines 在读取文件后保持文件锁定,我无法写入文件

出于某种原因,File.ReadLines 使我正在读取的文件保持锁定状态,当我尝试使用 streamWriter 将文本写入其中时,我收到一个错误,表明它正被另一个进程使用。如果我不先阅读它,写入它就可以正常工作。这是我的代码

    IEnumerable<String> lines;
    private void loadCfg()
    {
        lines = File.ReadLines(Application.StartupPath + @"\server.cfg");
        foreach (var line in lines)
        {
            if (line.Contains("Port"))
            {
                portTxtBox.Text = extractValue(line);
            }
            if (line.Contains("Cars"))
            {
                maxCarsCombo.Text = extractValue(line);
            }
            if (line.Contains("MaxPlayers"))
            {
                maxPlayerCombo.Text = extractValue(line);
            }
         }
      }

   private void saveBtn_Click(object sender,EventArgs e)
    {
        StreamWriter sw = new StreamWriter(Application.StartupPath + @"\server.cfg",false);
        sw.WriteLine(lines.ElementAt(0));
        sw.Close();
    } 

解决方法

好吧,您应该使用 StreamReader 类读取所有行,这样您的文件将被正确关闭我改变了您读取行的方式以使用 StreamReader 读取所有行尝试以下版本

    List<string> lines = new List<string>()
    private void loadCfg()
    {
        string temp = null;
        StreamReader rd = new StreamReader(Application.StartupPath + @"\server.cfg");
        temp = rd.ReadLine();
        while(temp != null)
        {
            lines.Add(temp);
            temp = rd.ReadLine();
        }
        rd.Close();

        foreach (var line in lines)
        {
            if (line.Contains("Port"))
            {
                portTxtBox.Text = extractValue(line);
            }
            if (line.Contains("Cars"))
            {
                maxCarsCombo.Text = extractValue(line);
            }
            if (line.Contains("MaxPlayers"))
            {
                maxPlayerCombo.Text = extractValue(line);
            }
         }
    }

   private void saveBtn_Click(object sender,EventArgs e)
    {
        StreamWriter sw = new StreamWriter(Application.StartupPath + @"\server.cfg",false);
        sw.WriteLine(lines.ElementAt(0));
        sw.Close();
    } 

我还没有测试过代码,但我相信它会解决你的问题

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。