我想通過向其物理區域寫入零來完成刪除文件的工作。如何在硬盤上獲取文件物理位置
文件可能存儲在硬盤上,並不總是在整個塊中。
當我說物理區域。我的意思是存儲文件的物理部分,或者是可以執行「寫入零」的那些部分的任何引用。
C#中更好。
我想通過向其物理區域寫入零來完成刪除文件的工作。如何在硬盤上獲取文件物理位置
文件可能存儲在硬盤上,並不總是在整個塊中。
當我說物理區域。我的意思是存儲文件的物理部分,或者是可以執行「寫入零」的那些部分的任何引用。
C#中更好。
不幸的是,即使您正在編寫內核模式驅動程序,這在C#中也不是完全可能的,在C/C++中也不是這樣。從Bleachbit documentation:
報價碎紙一個單獨的文件正確假定它的位置可以完全清楚,但基本上只能在一個理想的case.The理想的情況下被稱爲有三個特點:
- 由於編輯文件大小從未縮小。想象一下,從3MB電子表格開始,將其編輯爲1MB(使用電子表格應用程序),並要求清潔應用程序刪除1MB版本:清潔工無法知道在物理硬盤驅動器上分配的缺失2MB空間。 (請記住:文件系統通常不會連續存儲文件,因此您不能假定缺少的部分位於已知部分的後面)。
- 文件從未移動。想象一下,電子表格軟件通過將新副本寫入臨時文件,刪除舊副本以及將臨時文件重命名爲原始名稱來保存文檔。在這種情況下,清潔程序無法知道任何舊電子表格的位置。
- 文件系統將文件覆蓋到相同的地方。這是一個很好的假設。在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);
}
我不確定你能做到這一點。 根據This,您只能使用非託管代碼來執行此操作。
一般來說,沒有用於此的.NET API。很可能你正在從磁盤手動讀取FS結構並解析文件分配結構,並使用互操作來轉到低級塊IO。
您可能想要嘗試將零寫入文件而不更改其長度並觀察發生的情況。有可能文件不會被重新分配。我真的不知道是否是這種情況,我懷疑它取決於操作系統,操作系統版本,FS,甚至在固態硬盤和硬盤驅動器之間也有所不同。
此外,請考慮最近由操作系統重新分配您試圖碎化的文件的情況。該文件使用的某些區域現在標記爲「空」,但數據仍然存在。 (幾乎)沒有辦法找出這些區域是什麼/沒有真正「切碎」整個磁盤。
另外,對於我們之間的偏執狂來說:在文件區寫入零(或一個,或垃圾)並不能保證舊數據不可恢復。物理上破壞驅動器可能會訣竅,但沒有API;)
我敢肯定,你不能單獨使用.NET來做這件事,你將不得不使用一些低級調用來做這個。 – Kolky 2012-01-10 08:11:02
爲什麼你想自己寫這個?有許多公用事業公司已經在市場上做到了這一點。順便說一句,在現有的扇區上寫零不會完全擦除文件 - 某些軟件仍然能夠檢索(部分)數據。 – 2012-01-10 08:14:02
寫入物理扇區不可能從用戶模式,需要一個內核模式驅動程序 – 2012-01-10 08:14:50