用打比方的方式來回答的話,普通的刪除就好比工商局要查封一家店,把人趕出去在門口貼個封條,把入口堵了。如果後面事情說清楚了,罰款交了,那麼撕掉封條就可以營業了。時間耽擱得長的話,可能一些店員也已經去了別的地方,需要找新的店員,但是還是可以很快恢復營業的。

而用別的文件覆蓋,就好比地也被拍賣了,房子拆了,別人在這裡蓋了新房。要想在原址恢復以前的店,就沒有那麼容易了。

順便提一句,對於某些存儲介質,比如機械式硬碟(磁記錄),即便被其它文件覆蓋了,通過特殊的技術手段依然可以讀出之前1~2個版本的文件數據(利用剩磁)。就好比通過考古,可以挖出以前的房子的地基。所以,對於機密性極高的文件,需要使用特別的軟體,按照特別設計的數據格式,對該區域進行3-5次的反覆寫(多次平整土地),才能比較乾淨地消除之前的痕迹。


就像在愛情中

想要徹底忘記一個人

最好的辦法就是開啟一段新的戀情


我看了一下大多數的答案都沒說到點子上;

本答案默認所說的刪除是刪除之後且從回收站清空了,不然肯定是不能真正刪除的;

其實並不是不會被真正刪除,這個是分兩種情況的:

1,使用的是機械硬碟,此時確實是不會真正刪除,只是給文件頭加個標識符告訴系統這個文件已經刪除了,原因無它,只是為了效率而已,機械硬碟在有文件的區域是可以直接寫文件的,既然如此那何苦費勁去真正刪除它呢?有新文件的時候直接覆蓋就可以了嘛,不每次都真正刪除寫0並不是因為其它答案說的會增加磁碟寫入次數,機械硬碟的壽命和磁碟的寫入次數沒有明顯關係,只是因為完全沒必要而已,去單獨寫一遍0去覆蓋,那不是吃飽了撐的么……;

2,使用的是固態硬碟,文件是會被真正刪除的,因為固態硬碟不能在有數據的塊上面直接寫數據,需要先清空才行,所以如果是固態硬碟,那麼刪除的文件是真正的刪除,可能是立即刪除,也可能是在主控空閑的時候再刪除(稱之為垃圾回收),總之肯定是會被真正刪除的,之所以有些會在主控空閑的時候再刪除是為了效率,防止刪除操作佔用寫入操作的速度

再解釋一下SSD的壽命問題吧,SSD是有快閃記憶體(flash)組成的,flash沒有讀取壽命,讀取多少次都無所謂,但是會有寫入壽命,每次寫入稱之為1個PE,寫入達到一定的PE之後該flash就會報廢;

比如512G的SSD,理論上我們寫入512G的數據,就會消耗1個PE,不過實際使用中,會有寫入放大的存在,比如我們只寫入了不到256G就消耗了1個PE,這是因為如下原因: 1,flash的最小擦除單位為塊,而塊一般都不小,比如說是512K,那麼我們即便寫入4K數據也得擦一個塊,這就導致了寫入放大的產生;

2,磨損均衡演算法,上面說了flash是有寫入壽命的,我們總有一些文件是萬年不動它的,如果一直在固定的塊裡面存著,那麼這些顆粒還很新呢其它一直用的顆粒就報廢了,所以主控會在空閑的時候把這些顆粒的數據搬移到已經磨損很嚴重的顆粒上面去,再使用這些顆粒,保證所有的顆粒基本上同時達到壽命,這個也會造成寫入放大;


以下信息僅僅是我通過一些科普途徑了解到的。

現代文件系統會在物理設備(例如硬碟)中劃分一個索引區,所有的文件、文件夾的位置、大小、時間等信息會存放在這裡。使得文件系統有相當高的檢索效率。而實際的文件數據,則寫入到剩下的存儲區中。

在讀取文件時,系統先從索引區得到文件的實際儲存位置,然後跳轉到相應位置開始讀取。

當刪除一個文件時,只在索引區將文件信息清除並將相應存儲區域標記為「無文件」,實際數據還在存儲區不動。

只有下一個文件的數據寫入到相同的位置將原有數據覆蓋,這個文件才會完全消失。


因為沒有必要,如果真正刪除blocks中的數據,比如說全部置低電平,那麼刪除將會和寫入數據耗費同樣的時間,而且這麼做了也沒什麼好處,反而會增加磁碟的讀寫次數,所以只要通過特定的數據結構比如bitmap記住哪塊blocks是可以寫入的就行了,在再次寫入的時候,寫入的數據會覆蓋掉原本存在的二進位信息。

補充:Linux中的刪除文件並不是真正的刪除文件,而是降低索引節點inode的引用次數,如果減到0的話,就刪除索引節點,並且把inode記錄的block號在bitmap中置為空閑狀態,後面可以再次寫入文件。


因為效率,如果把硬碟比作一個倉庫,數據比作一個貨物,那麼你花了一個小時搬這個貨物進來,如果要」刪除」這個貨物,那麼一樣要花一個小時把貨物搬出去,這樣對於電腦用戶來說是不可接受的,於是有了一種取巧的辦法,要刪除的時候,只是給這個貨物貼上」刪除」的標籤,當倉庫已經沒有空間放新貨物的時候,或者一些其他原因要清出一大片連續的區域放新貨物的時候,系統才會去找標有已刪除貨物的標籤,這時候,新貨物搬進來的同時把舊貨物搬出去,這樣看起來就是新貨物把舊貨物(覆蓋)了,知道了這個原理就能清楚,哪怕被回收站刪除的文件實際上只是被貼了(刪除)的標籤,而這個貨物還是在倉庫里放著,這就是為什麼刪除一個好幾個G大文件也是瞬間刪除,而刪除幾千個小文件的時候需要耗費更多的時間,因為貼刪除標籤也是要時間的。


一些數據存儲在介質里,一般來講長期介質速度都相對較慢的。如果你可以管理介質里所有的數據,現在讓你來想一個辦法刪除這段數據,你會怎麼處理?

最直觀的辦法是像擦桌子一樣,把它們都擦除。但事實上,數據量太大了,一個一個的擦除很慢,而且很毀介質的。你想想,計算機存儲的都是0和1,那其實擦起來無非就是把兩種狀態都變成其中一種,然後將來再在這個區域寫入的時候又變一次,這就得不償失了。

所以更好的辦法是,既然可以管理整個介質,那我就乾脆不去真的擦除它,而是在紙上畫一個表格,把那些刪除的部分給記錄下來,等到用戶想訪問這些地方的時候,就直接告訴他們「數據刪除」。那麼其實只要訪問途徑只有通過我這個表格一種,就做到了掩耳盜鈴,我也不用煞費苦心的真的去把它擦除了。


就像一張紙,寫錯了一行你可以選擇在行頭打個叉,或者用修正帶覆蓋掉錯的。


機械硬碟如果真正的刪除,那要花幾分鐘時間在硬碟上擦寫,既浪費時間又浪費硬碟壽命。如果只是標記上「此區域可覆蓋」,那就可以瞬間完成,簡單便捷。


公司老闆開出一個員工難道除名還不夠,非得把他殺死嗎?


會不會刪除看文件系統具體實現,反正,主流的文件系統絕對不會幫你把文件內容清空,沒那個必要。也就是說,無論硬體物理實現是什麼樣的,磁帶也好,磁碟也罷,哪怕是快閃記憶體,從軟體層面上講,通常(主流文件系統)是不會把文件內容清空的。如果你是學這個的,建議看一下具體文件系統的實現;如果不是,知道這事也就足夠了。


從實現的角度考慮,把要刪的地址塊標記一下然後放內存里,然後通過順序寫入的方式非同步的刷進磁碟,需要的時間是微妙級的,直接抹去對應的數據,需要的數據是毫秒級的,性能差幾百倍


了解一點文件系統,要刪除一個文件,把它對應的node刪除就行了,這樣在文件樹下你就找不到它了,沒必要把它刪除了,可能還有其它node對應它呢。


這話不對

好吧一定意義上這句話對

不完全對?不廣義上是對的。

怎麼說呢,這要涉及到數據的儲存方式是把二進位的00000變成有一定排列的101011(這組數據只是舉個例子)

再進一步就是把一個磁碟上的儲存單位(小金屬體)磁化成不同的極性

刪除就是把有排列的101011還原成000000

進一步就是把這個文件佔有的所有磁體全都磁化成被識別為0的極性,這就是為什麼在清理磁碟的時候叫做「格式化」了。

數據單位就在這裡,除非你使用物理操作去除這一部分的儲存單位(作大死不要嘗試了)。只是說它儲存的極性計算機將它人(機)為的規定相當於沒有(有效)數據。

當然了只是個人見解,從理論上的

而且理論上格式化了之後應該文件就無法恢復了,因為排列被削除了。當然了,質量很差的讀取器就另當別論。如果消磁失敗或者不徹底的話,通過高強度的磁性識別掃描,還是能還原文件的。

後門程序這裡不談。然後存在「回收站」里的文件也不談。這倆太扯,談了也沒啥意義。


硫酸倒過去就沒了


這得說我們的文件是如何在硬碟上存儲的

我們都知道硬碟是通過修改存儲單元不同狀態以標記0/1來存儲數據。而文件系統通常是有一個文件索引表和數據存儲區。

當存在一個文件的時候,系統會將某一塊數據存儲區標記為佔用,所以當讀寫其他文件時會避開這個區域。

而當文件系統在刪除一個文件的時候,並不會直接去修改對應部分的存儲區,而是直接把文件索引表中這部分區域標記為未佔用,可想而知,相比去覆蓋相關區域數據而言,只刪除文件索引可以大大加快速度。


1 011 01101001010100 100

假設1代表被佔用不能被覆蓋,011代表文件頭100代表文件尾。

但是我的硬碟有接近10T的容量,要把每一個都擦為0那工程量就太大了,甚至只是擦除數個G的文件速度就夠你受的。

所以一般刪除就會把代表不能被覆蓋的1改為0,把這個文件標記為可以被覆蓋,這樣容量也可以釋放,又把原本屬於寫入一票0的任務交給了以後寫入新文件去覆蓋節約大量時間。在這個期間這個文件只是你看不到而不是完全消失了。

而你覆蓋只是將原本應該執行下去第二步完成了而已。

但即便被覆蓋了還是有被還原的可能性,所以又有了多次複寫。就算這樣也不一定穩妥而且效率太低,所以有的請鎚子或者粉碎機上陣。不過了某個層面哪怕被錘成渣的碎片也會被收集分析後就是高溫重熔的領域了。


時間不會磨平一切,新歡才會


系統下的刪除只是把文件系統里的表去掉相應位置而已,不然就是大動干戈把刪除的區域全部轉成0或1,你不會想這樣的


這玩意要是真這麼來非得把一張硬碟存滿了再會覆蓋舊的存新的數據啊,工程師是魔鬼吧這麼設計,定址也是要耗電耗時間的啊


可以用在沙地上寫字做個比方

首先要知道計算機儲存空間空閑區域和非空閑區域的區別,空閑區域並不是說這塊沙地一定要是平整的,而是這塊沙地是可用的,即使這塊沙地上面寫的有字,我們仍然有往上面寫字的自由

那麼刪除文件其實也不是把沙地變平整,而是忽略上面的內容,並且賦予計算機在上面寫字的權力,每當需要用到這塊空閑沙地時,計算機就自動把沙地抹平,再往上面寫字

故計算機文件剛剛刪除,沒有往上面覆蓋文件這個狀態就相當於空閑的沙地沒有往上面寫字,因為沙地的狀態和文件刪除前的狀態一樣,並沒有抹平,所以我們可以隨時恢復這塊沙地上面的內容


一個文件在磁碟中分為兩部分:一部分是數據,也就是文件本身的內容;另一部分是元數據,記錄了文件名、文件的目錄關係、創建時間等,以及「數據」保存在什麼地方。

刪除文件的時候,只修改了元數據(同一文件系統下移動文件也是如此)。而文件的「數據」,就迷失在磁碟中,文件系統再也找不到它了。但是數據依然存在著,通過一些特殊的手段找到這些「數據」就行了。

而寫入其他文件時,就有可能把這些「數據」覆蓋掉,也就是原來的數據「消失」了

PS: 如果平時留意的話,就會發現,複製粘貼文件的時候,Windows提示的是「已完成...mb, 剩餘...mb」,而刪除文件的時候,Windows提示的是「已完成...項,剩餘...項」。這說明刪除的速度只和文件數量有關,和文件大小無關。


前幾天看到的,謝謝大佬科普。希望能有更多的人看到

Shieieiki:【為什麼刪除的數據可以恢復,詳解磁碟儲存數據與數據恢復的原理】?

zhuanlan.zhihu.com圖標

我只是個搬運工


推薦閱讀:
相关文章