StreamWriter有时会清除我的文件

时间:2012-03-03 02:20:08

标签: c# streamwriter

我正在制作一个程序来添加/删除Windows主机文件中的条目。到目前为止它工作正常,除非有时当我使用我的表单删除项目时,它将清除整个主机文件,不留任何内容。

这是我的代码:

 public void removeFromHosts(String key)
    {
        MessageBox.Show(key);
        if (key != "" || key != " ")
        {
            String[] strings = new String[1000];

            String all = File.ReadAllText(hostFile);

            strings = all.Split('\n');


            StreamWriter writer = new StreamWriter(hostFile);

            foreach (String s in strings)
            {
                if (s != "255.255.255.255 " + key + " #Blocked by MyProgram")
                {
                    writer.Write(s);

                }
                else
                {
                    textBox1.Text += s;
                }
            }



            writer.Close();

            blockurls.SelectedItems[0].Remove();

            MessageBox.Show("URL Successfully removed");
        }
        else
        {
            MessageBox.Show("Empty");
        }
    }

我基本上检查文本文件中的每一行以查看它是否包含url,如果它不包含url则将该行写入该文件。是什么导致它擦除整个文件?

2 个答案:

答案 0 :(得分:2)

在我看来,您正在检查条目是否“包含”输入的值。但是,这将是危险的。在documentation中它声明如果你传递一个空字符串,contains将始终返回true。如果键为空字符串,则将删除所有行。此外,如果您的密钥类似于“a”,那么所有带有a的条目都将被删除。也许您应该检查字符串是否等于键,或者进行更复杂的检查。我假设您输入主机名作为密钥,选择该行,并确保主机名与密钥中的值匹配。

您可以通过将包含替换为

之类的内容来修复代码
s = "255.255.255.255 " + key

或者

Regex.IsMatch(s,"^255\.255\.255\.255\s+" + Regex.Escape(key) + "\s*$")

答案 1 :(得分:0)

使用此代码修复:

public void removeFromHosts(String key)         {

            ArrayList strings = new ArrayList();

            StreamReader reader = new StreamReader(hostFile);

            while (reader.Peek() > -1)
            {
                strings.Add(reader.ReadLine());
            }


            reader.Close();

            StreamWriter writer = new StreamWriter(hostFile);

            foreach (String s in strings)
            {
                if (!s.Contains("255.255.255.255 " + key + " #Blocked by Parental Care"))
                {
                    writer.Write(s + "\n");

                }
            }



            writer.Close();

            blockurls.SelectedItems[0].Remove();

            MessageBox.Show("URL Successfully removed");

    }