StreamWriter有时会清除我的文件

本文关键字:我的 文件 清除 StreamWriter | 更新日期: 2023-09-27 18:26:26

我正在制作一个程序,向Windows主机文件添加/删除条目。到目前为止,它运行良好,只是有时当我使用表单删除项目时,它会清除整个hosts文件,什么都不留下。

这是我的代码:

 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,那么将该行写入文件。是什么原因导致它擦除了整个文件?

StreamWriter有时会清除我的文件

在我看来,您正在检查条目是否"包含"输入的值。然而,这将是危险的。在文档中,它指出,如果您向它传递一个空字符串,contains将始终返回true。如果关键字为空字符串,则将删除所有行。此外,如果您的密钥类似于"a",则所有带有a的条目都将被删除。也许您应该检查字符串是否等于键,或者进行一些更复杂的检查。我假设您输入的是主机名作为关键字,将行拆开,并确保主机名与关键字中的值匹配。

你可能可以通过用之类的东西替换包含来修复你的代码

s = "255.255.255.255 " + key

或者

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

使用以下代码修复:

public void removeFromHosts(字符串键){

            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");
    }