StreamWriter иногда очищает мой файл - PullRequest
0 голосов
/ 03 марта 2012

Я делаю программу для добавления / удаления записей в файле хостов 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, а затем записать эту строку в файл. Что может быть причиной того, что он сотрет весь файл?

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Мне кажется, что вы проверяете, содержит ли запись введенное значение. Однако это было бы опасно. В документации говорится, что если вы передадите ей пустую строку, свойство содержит всегда вернет истину. Если ключ является пустой строкой, все строки будут удалены. Кроме того, если ваш ключ что-то вроде «а», то все записи с а будут удалены. Возможно, вам следует проверить, равна ли строка ключу, или выполнить более сложный вид проверки. Я предполагаю, что вы вводите имя хоста в качестве ключа, выделяете строку и убедитесь, что имя хоста соответствует значению в ключе.

Возможно, вы могли бы исправить свой код, заменив содержимое чем-то вроде

s = "255.255.255.255 " + key

Или, может быть

Regex.IsMatch(s,"^255\.255\.255\.255\s+" + Regex.Escape(key) + "\s*$")
0 голосов
/ 03 марта 2012

Исправлено с использованием этого кода:

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

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...