2012-12-21 107 views
-1

在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(); 

在這裏,我需要一些幫助來解鎖從列表框(lbWebsites)中選擇的特定網站。有沒有辦法從主機文件中刪除它們?我嘗試了很多,並尋找其他解決方案,但每種解決方案都出現問題。

+3

當然,這是可能的。閱讀文件並刪除要取消阻止的IP並重寫該文件。 「出現問題」甚至意味着什麼? – PhoenixReborn

+0

出錯了 - 寫入權限? – fableal

+0

使用主機文件阻止網站並不是最好的方式。只需使用內置的windows-firewall來做到這一點;)想象一下你已經安裝了本地代理的情況;) –

回答

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 

謝謝,
我希望對您有所幫助:)

+0

非常感謝,它幫了我很多:) – user1913674

+0

@ user1913674我很高興我能幫上忙。 [請注意,您可以將帖子標記爲表示您已解決問題的答案](http://i.stack.imgur.com/uqJeW.png)。祝你有美好的一天:) –

+1

+1。考慮使用'using(){...}'代替'.Close',因爲它安全('try' /'finally'已經爲你寫了 - 你的示例丟失了)並且更易於讀取/驗證。 –

3

您需要刪除您寫入的行來阻止網站。最有效的方法是讀入hosts文件並重新寫入。

順便說一下,你的阻止網站的方法不會很有效。對於您的使用場景可能沒有問題,但技術人員會知道要查看hosts文件。

+1

+1; Windows 8智能屏幕也積極地還原HOSTS文件的變化,因爲它在攻擊中被廣泛使用。 – vcsjones

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

然後你有你的主機的所有行文件在行列表中。之後,你可以搜索你想解鎖,然後從列表中刪除該網站,直到所需的網站已不再列表:

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