2012-03-03 10 views
0

私は、Windows hostsファイルにエントリを追加/削除するプログラムを作っています。これまでのところ、私のフォームを使ってアイテムを削除するとき以外はうまくいきます。ホストファイル全体をクリアして、何も残しません。ここでStreamWriterが時々私のファイルを消去する

は私のコードです:

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が含まれているかどうかを確認するためにテキストファイルで各行をチェックしています。何が原因でファイル全体が消去される可能性がありますか?

+0

タイトルに「C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

答えて

2

入力した値がエントリに「contains」が含まれているかどうかを確認しているようです。しかし、これは危険です。 documentationでは、空の文字列を渡すと、containsは常にtrueを返します。キーが空文字列の場合、すべての行が削除されます。また、あなたのキーが "a"のようなものなら、aを持つすべてのエントリは削除されます。文字列がキーと等しいかどうかをチェックするか、より複雑なチェックを行う必要があります。私はあなたがキーとしてホスト名を入力していると仮定し、行を選んで、ホスト名がキーの値と一致することを確認します。

おそらく

s = "255.255.255.255 " + key 

それとも、このコードを使用して固定

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

包含チェックを少し具体的に更新しました。井戸を取り除いているようだが、時にはすべての項目を削除することもある。 –

+0

もう一度keyが空であれば、最初に255.255.255.255のすべてのエントリが削除されます。試行する前に、値が空であるかどうかを確認することをお勧めします。 – Kibbee

+0

私はs =上の更新されたコードで見ることができる完全な文字列かどうか確認しました。 –

0

ようなもので含まれてい置き換えることによって、あなたのコードを修正することができます:

ます。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"); 

    } 
+0

'File.ReadAllLines()'を使わないのはなぜですか? – BrokenGlass

+0

これまで私が使っていたことがあります。これは今働き、私はそれを変更したくありません。 –

関連する問題