2012-01-10 37 views
4

我想通過向其物理區域寫入零來完成刪除文件的工作。如何在硬盤上獲取文件物理位置

文件可能存儲在硬盤上,並不總是在整個塊中。

當我說物理區域。我的意思是存儲文件的物理部分,或者是可以執行「寫入零」的那些部分的任何引用。

C#中更好。

+1

我敢肯定,你不能單獨使用.NET來做這件事,你將不得不使用一些低級調用來做這個。 – Kolky 2012-01-10 08:11:02

+1

爲什麼你想自己寫這個?有許多公用事業公司已經在市場上做到了這一點。順便說一句,在現有的扇區上寫零不會完全擦除文件 - 某些軟件仍然能夠檢索(部分)數據。 – 2012-01-10 08:14:02

+0

寫入物理扇區不可能從用戶模式,需要一個內核模式驅動程序 – 2012-01-10 08:14:50

回答

6

不幸的是,即使您正在編寫內核模式驅動程序,這在C#中也不是完全可能的,在C/C++中也不是這樣。從Bleachbit documentation:

報價碎紙一個單獨的文件正確假定它的位置可以完全清楚,但基本上只能在一個理想的case.The理想的情況下被稱爲有三個特點:

  1. 由於編輯文件大小從未縮小。想象一下,從3MB電子表格開始,將其編輯爲1MB(使用電子表格應用程序),並要求清潔應用程序刪除1MB版本:清潔工無法知道在物理硬盤驅動器上分配的缺失2MB空間。 (請記住:文件系統通常不會連續存儲文件,因此您不能假定缺少的部分位於已知部分的後面)。
  2. 文件從未移動。想象一下,電子表格軟件通過將新副本寫入臨時文件,刪除舊副本以及將臨時文件重命名爲原始名稱來保存文檔。在這種情況下,清潔程序無法知道任何舊電子表格的位置。
  3. 文件系統將文件覆蓋到相同的地方。這是一個很好的假設。在Windows NTFS和Linux上,最常見的ext3配置(這是Ubuntu 9.10和其他Linux發行版上的默認配置)會覆蓋同一位置的文件,但透明磁盤壓縮,加密和稀疏文件可能不會覆蓋文件。

另外:當一個現代的硬盤驅動器的面積被破壞,它會自動重新映射壞扇區,以備用。這些操作由驅動器固件自行決定,操作系統和應用程序都不知道該移動,因此擦除驅動器會忽略損壞的區域。

話雖如此,有可能(儘管不是很容易)找出驅動器的哪個扇區目前佔據。然而,這要求您的應用程序(至少部分)理解所使用的文件系統以及該文件系統如何在底層介質上存儲文件。

最後,問題仍然是通過識別文件佔用的所有扇區並填充0來獲得額外的安全性。只是在做

using(var fs = new System.IO.FileStream(@"m:\delme.zip", 
             FileMode.Open, 
             FileAccess.Write, 
             FileShare.None)) 
{ 
    var zeros = new byte[fs.Length]; 

    fs.Write(zeros, 0, zeros.Length);  
} 
+0

偉大的思想。我喜歡想出來的方式!謝謝。 – Frank 2012-01-10 08:33:44

+0

感謝您的誇獎。 =) – afrischke 2012-01-10 09:00:03

0

我不確定你能做到這一點。 根據This,您只能使用非託管代碼來執行此操作。

1

一般來說,沒有用於此的.NET API。很可能你正在從磁盤手動讀取FS結構並解析文件分配結構,並使用互操作來轉到低級塊IO。

您可能想要嘗試將零寫入文件而不更改其長度並觀察發生的情況。有可能文件不會被重新分配。我真的不知道是否是這種情況,我懷疑它取決於操作系統,操作系統版本,FS,甚至在固態硬盤和硬盤驅動器之間也有所不同。

此外,請考慮最近由操作系統重新分配您試圖碎化的文件的情況。該文件使用的某些區域現在標記爲「空」,但數據仍然存在。 (幾乎)沒有辦法找出這些區域是什麼/沒有真正「切碎」整個磁盤。

另外,對於我們之間的偏執狂來說:在文件區寫入零(或一個,或垃圾)並不能保證舊數據不可恢復。物理上破壞驅動器可能會訣竅,但沒有API;)

+0

感謝您的回覆。我想知道爲什麼不能保證?空間可以容納兩塊數據嗎? – Frank 2012-01-10 08:36:37

+1

@Feng硬盤基本上是帶電的金屬片。你*可以*從拆卸的硬盤讀取剩餘電量,並重新構建數據(即所需的昂貴機器和技能,ofc),即使它被重複覆蓋。 – Alex 2012-01-10 10:24:25

相關問題