天天看點

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

在“個人電腦清除軟體”中需要對檔案進行徹底粉碎,使其不可恢複.這篇文章主要講述的是windows檔案系統及調用sdelete程式徹底粉碎檔案,希望文章對大家有所幫助.

首先,我回顧湯子丹西電版《計算機作業系統》(此篇部分參考該書)課程中學過的知識,也希望大家去閱讀了解,如果不想知道這部分知識的可以跳過.為了文章的完整,我覺得這部分還是必要的.

1.檔案及檔案系統

(1).檔案系統

為了友善使用者使用軟體資源,由os提供的管理檔案的軟體機構.負責管理在外存上的檔案,并把對檔案的存取、共享和保護等手段提供給使用者,檔案系統的管理功能是通過把它所管理的程式和資料組織成一系列檔案的方法實作.它是作業系統用于明确磁盤或分區上的檔案的方法和資料結構,即在磁盤上的組織檔案的方法.

(2).檔案

它是指具有檔案名的若幹相關元素的集合,元素通常是記錄,而記錄又是一組有意義的資料項的集合.基于檔案系統的概念将資料組成分為資料項、記錄和檔案三級.

(3).檔案控制塊

每個檔案都有唯一的辨別符(fcb,file control block,檔案控制塊),通過該辨別符存取檔案中的資訊.通過檔案目錄表中檔案的名字及實體位址的映射表及fcb可以擷取檔案中的資訊,包括:檔案名、檔案類型、檔案實體位置、檔案邏輯結構、存取控制塊資訊(存取權限)、使用資訊(檔案建立時間、上次使用時間、目前使用資訊)等.

ps:這部分資訊隻是簡單進行了介紹,詳細的可看書或自己查閱資料.那麼微軟的檔案系統又是什麼呢?

2.fat和ntfs技術

在微軟早期的ms-dos中使用12位的fat12檔案系統,後來使用fat16.在windows 95和windows98作業系統中更新為32位的fat32,windows nt、2000、xp作業系統使用新技術檔案系統ntfs.而它們所采用的檔案配置設定方式基本都類似于顯示連結的方法.

(1).顯示連結

在外存配置設定中連結配置設定方式采取離散的配置設定方法,有效的消除了外部碎片,提高外存空間使用率.同時,動态配置設定檔案和盤塊,十分友善.而顯示連結用于連結各實體塊的指針,顯示地存放在記憶體的一張連結表中.

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

其中檔案配置設定表的序列号是實體盤塊号,從0開始,檔案的第一個盤塊号都被存儲在相應的fcb中,通過它可查到相應的檔案内容,同時在表中存放有連結指針,指向下一個盤塊号(鍊式存儲時一個檔案可由多個盤塊組成).

由于配置設定給檔案的所有盤塊号都存儲在該表中,故把該表叫檔案配置設定表fat(file allocation table).

(2).fat

檔案配置設定表(file allocation table,fat)檔案系統因它使用了檔案配置設定表來描述檔案系統記憶體儲單元簇的配置設定情況和檔案内容的前後連接配接關系而得名.包括fat12、fat16和fat32.

簇(cluster)是一個新的配置設定機關,是一組連續的扇區,在fat中作為一個虛拟扇區.其大小一般為2n(n為整數)個盤塊.在ms-dos實際中,簇容量可為僅一個扇區(512b)、兩個扇區(1kb)、四個扇區(2kb)、八個扇區(4kb).簇的優點是能适應磁盤容量不斷增大.

fat12的簇辨別為12位(二進制數),在fat12表中最多允許有4096個表項,即最多隻能将一個磁盤分區分為4096個簇.如果采用以盤塊作為基本配置設定機關,每個盤塊(扇區)大小是512位元組,每個磁盤分區容量是2mb(4096*512b).

這裡,fat16和fat32就不過多講述,希望讀者自己研究,感覺能力有限,有點講述不清楚.

fat檔案系統可分為三部分:保留區(dbr)、fat區和資料區.如下圖所示:

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

a.保留區:存儲一個重要的資料結構——系統引導扇區(dbr),其位于檔案系統的0号扇區,dbr存儲了其所在檔案系統有關的重要資訊.

b.fat區:具有兩個大小、資料内容相同的fat表組成,緊跟在保留區後.fat表用于描述資料區中資料存儲單元的配置設定狀态及為檔案或目錄内容配置設定的存儲單元的前後連接配接關系.

c.資料區:它被劃分為一個個簇,用于存儲使用者資料.

(3).ntfs

ntfs(new technology file system,新技術檔案系統)是一個為windows nt開發的、為特别網絡和磁盤配額、檔案加密管理安全特性的全新檔案系統,并适用于windows 2000\xp\2003.ntfs也是以簇為機關存儲資料檔案的,其簇的大小并不依賴磁盤或分區的大小,由于簇尺寸有縮小,故能減少産生磁盤碎片、降低磁盤空間浪費.

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

在ntfs檔案系統中,使用卷表示一個邏輯磁盤.它存在一張主要檔案表mft(master file table),将一個卷中的所有檔案資訊、目錄資訊及可用的未配置設定空間資訊記錄在mft中.ntfs利用b-tree檔案管理方法跟蹤檔案在磁盤上的位置.現在使用的win7/win8/vista都是ntfs檔案系統.如圖:

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

(該例參考戴士劍的《資料恢複技術》書籍)

在日常生活中我們可能清空資源回收筒或使用shift+delete删除檔案,但其實它是可以恢複的.

這就好比磁盤檔案系統想象成一本書,需要找到某部分内容時,一般通過書最開始部分目錄索引查找,當删除一部分内容時,隻簡單的删除目錄索引,而内容可以通過其他方式找到(如一頁頁查找).同樣,os存取檔案時是以簇為機關進行,一簇包括若幹實際磁盤空間(扇區),同時以簇鍊的形式儲存檔案配置設定表(fat),相當于索引.當删除一個檔案會将檔案在配置設定表中簇辨別記為"空簇".但資料區會保留着檔案内容,是以可以恢複.

下面是通過資料恢複精靈恢複例子:使用shift+delete永久删除f盤下兩個檔案"擷取cookies.txt"和"c#winform學習.docx",使用資料恢複精靈可以實作恢複.(我的是未注冊版本,僅成功嘗試恢複了txt和word檔案).

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

微軟提供了sdelete程式安全删除檔案并使磁盤資料無法恢複,使用sdelete安全删除檔案也可以安全地擦除存在磁盤的未配置設定部分中的任意檔案資料(包括已删除或加密的檔案).sdelete程式實施了美國國防部摧毀标準(clearing and sanitizing standard) dod 5220.22-m.

我在移動硬碟h中放入兩張圖檔"程式删除.jpg"和"資源回收筒删除",删除過程如下圖所示,cmd程式中輸入sdelete -p 2 "h:\程式删除.jpg".調用sdelete并執行2次覆寫操作.

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識
C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

下面是使用easyrecovery軟體能實作對資源回收筒删除的圖檔恢複,而使用sdelete删除不能恢複的圖檔.最後實作了資源回收筒删除圖檔的恢複功能.

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識
C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識
C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識
C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

思考:為啥需要覆寫操作執行多遍呢?我的老師給我說删除6遍時較幹淨,why? 

 (部分參考丁士鋒的《c#典型子產品與項目實戰大全》)

我打算通過建立process,并設定其參數實作删除檔案功能,代碼如下:

但是,雖然已經把sdelete.exe放置于“c:\windows\system32”檔案夾下,使用cmd運作才能正确删除,但當通過c#代碼調用時總是會顯示錯誤"系統找不到指定檔案".這讓我萬分傷心啊,但同時該方法的不足之處是需要使用者放置sdelete程式,是以我需要尋求新的方法實作粉碎檔案.

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

但是代碼中所涉及的使用process的方法還是值得大家學習的,我們還可以通過它實作很多功能,如下:

下面是調用cmd.exe程式實作ipconfig檢視功能,但是當使用"sdelete -p 2 "f:\test.txt""時還是不能運作,我也不知道為什麼?不知道怎麼通路sdelete.exe程式,使用管理者權限運作也不行.

cmd中ipconfig的運作結果如下,但使用sdelete參數就是不行(>.<):

C# 系統應用之調用SDelete程式粉碎檔案及基礎原理知識

總結:最後希望該篇文章對大家有所幫助,它僅僅是一篇基礎性的設計檔案系統的文章,如果文章中有錯誤或不足之處,還請海涵!同時文章主要參考了文中提到的3本書籍,如果有認為文章過于啰嗦或不喜歡的,也請見諒!寫這篇文章真心有點難,最難過的是沒有實作,如果有知道的請說聲.我開始尋找更好的粉碎檔案的方法了.