取消阻止特定网站

时间:2012-12-21 17:53:10

标签: c# hosts

在C#中使用hostfile我可以阻止网站但我无法解锁它们。

String path = @"C:\Windows\System32\drivers\etc\hosts";
StreamWriter sw = new StreamWriter(path, true);
sitetoblock = "\r\n127.0.0.1\t" + txtException.Text;
sw.Write(sitetoblock);
sw.Close();

MessageBox.Show(txtException.Text + " is blocked", "BLOCKED");
lbWebsites.Items.Add(txtException.Text);
txtException.Clear();

在这里,我需要一些帮助才能解锁从listbox(lbWebsites)中选择的特定网站。有没有办法从主机文件中删除它们?我尝试了很多,并寻找其他解决方案,但每个解决方案都出了问题。

3 个答案:

答案 0 :(得分:3)

您需要删除您编写的行以阻止该网站。最有效的方法是读入hosts文件并再次写入。

顺便说一句,你阻止网站的方法不会很有效。对于您的使用场景可能没问题,但技术人员会知道查看主机文件。

答案 1 :(得分:1)

您可以使用StreamReader将主机文件读入string。然后,初始化StreamWriter的新实例以编写回收的内容,不包括您要取消阻止的网站。

示例

string websiteToUnblock = "example.com"; //Initialize a new string of name websiteToUnblock as example.com
StreamReader myReader = new StreamReader(@"C:\Windows\System32\drivers\etc\hosts"); //Initialize a new instance of StreamReader of name myReader to read the hosts file
string myString = myReader.ReadToEnd().Replace(websiteToUnblock, ""); //Replace example.com from the content of the hosts file with an empty string
myReader.Close(); //Close the StreamReader

StreamWriter myWriter = new StreamWriter(@"C:\Windows\System32\drivers\etc\hosts"); //Initialize a new instance of StreamWriter to write to the hosts file; append is set to false as we will overwrite the file with myString
myWriter.Write(myString); //Write myString to the file
myWriter.Close(); //Close the StreamWriter

谢谢, 我希望你觉得这很有帮助:)

答案 2 :(得分:0)

你可以这样做:

String path = @"C:\Windows\System32\drivers\etc\hosts";
System.IO.TextReader reader = new StreamReader(path);
List<String> lines = new List<String>();
while((String line = reader.ReadLine()) != null)
    lines.Add(line);

然后在行列表中包含hosts文件的所有行。之后,您可以搜索要取消阻止的网站,并将其从列表中删除,直到列表中不再包含所需的网站:

int index = 0;
while(index != -1)
{
    index = -1;
    for(int i = 0; i< lines.Count(); i++)
    {
        if(lines[i].Contains(sitetounblock))
        {
            index = i;
            break;
        }
    }
    if(index != -1)
        lines.RemoveAt(i);
}

完成后,只需将清理后的列表转换为普通字符串:

String content = "";
foreach(String line in lines)
{
    content += line + Environment.NewLine;
}

然后只需将内容写入文件;)

写在我脑海里,所以不保证没有错误:P