為什麼解壓縮文件時往往需要先解壓縮到系統盤裡的臨時文件夾下,然後再複製到目標文件夾?

這樣做不是增加了移動的時間嗎?


謝 @孤獨患者 邀。

@孤獨患者 的理解是基本正確的。

這其實只取決於解壓軟體的具體實現,並沒有什麼太多原理上的原因。

當你把文件從壓縮軟體中「拖」出的時候,壓縮軟體並不知道被拖到了那裡,只是接收了 Windows 發來的給定一個拷貝源的請求,所以必須要解壓到某個地方,通常是臨時文件夾,然後由 Windows 來完成移動到目標文件夾的工作。

另外,有一些特殊情況也會解壓到臨時文件夾,比如你直接雙擊打開了壓縮包中的文件運行的話,壓縮軟體依然要解壓所有文件(除了一些確保可以獨立運行的後綴以外),這時候只能解壓到臨時文件夾。

還有就是目標文件夾來源是一個可移動介質,比如 U 盤。為了考慮到目標介質對於解壓過程中動態的寫入可能會連接不穩定以及快閃記憶體顆粒壽命等一系列因素,通常也會先解壓到臨時文件夾再拷貝進去。


同意 @孤獨患者 的觀點(把名字粘進去同名太多召喚不到...)

拖拽文件時候如果把目標窗口的進程殺掉之後解壓完成文件會馬上提示錯誤:

「RPC伺服器不可用」(win7下 7z + Windows資源管理器 測試)

「拖動操作失敗」(winrar+資源管理器;這很明顯了...)

如果用7z拖拽時候窗口仍然可以正常操作,但是如果當前所在目錄路徑改變過之後,就會提示「未指定的錯誤」

(如果是拖拽到當前文件夾窗口空白區域)

而且在winrar下拖拽壓縮包內文件會導致目標窗口被掛起(點擊無反應),雙擊裡面的文件圖標位置也會在文件解壓複製完成後打開

目測都是調用系統介面進行回調,為了操作安全,rar將目標窗口掛起(可能是用的註冊的dll?)

不直接解壓到目標路徑可能也是微軟沒有暴露那樣的介面

巨硬自己的解壓zip的dll支持怎麼玩都不會報錯,而且也是直接解壓到目標目錄,而且好像也沒有經過臨時文件夾,不過既然是自家的東西那麼就很好解釋了,資源管理器為自家zip解壓的dll暴露了那樣一個介面...


以WINRAR為例,可以-右擊-需要被解壓縮的文件,然後拖動(右擊未釋放)至目標處釋放右擊,選擇需要的解壓操作,這樣操作解壓縮就不會經過臨時文件夾的中轉了。表達能力不是很好,哈哈。


就因為這個我也試過好幾個軟體 後來發現好壓能直接解壓到目標目錄就沒換過了 在此批評一下以winrar為主的軟體 真呢嗎反人類 解壓大遊戲簡直虐心 好不容易解壓完了 還要再複製一遍 花雙倍時間


平時日常使用時發現,右鍵壓縮文件,解壓縮,是會直接解壓到當前文件夾或目標文件夾的。而如果直接將文件從壓縮包里拖出來,則會先解壓到系統的臨時目錄下,再複製到目標文件夾。同時,我們也發現,如果直接在壓縮包里打開文件,所有有關聯的文件也是被解壓到臨時目錄下的。

因此我猜測,差別就在於『拖動』這一操作上。可能是『拖動』操作調用了windows自身的介面,而該介面的功能本身可能是類似於複製(或者移動)的操作(比如從一個文件夾拖到另一個文件夾,從D盤拖到E盤等)。因而我們有理由大膽猜測,當我們把文件從壓縮包里拖出來時,實際上是由操作系統的『拖動』介面『打開』了所有文件(所以解壓到了臨時文件夾下),並由操作系統把所有文件移動到目標文件夾下。

以上純屬個人猜測。錯了請輕拍。


主要原因是失敗了方便清理,就算清理失敗也沒關係。考慮一下原地解壓如果反覆解壓失敗清理不幹凈的感受吧,一堆奇怪的編號文件夾。

系統的移動文件夾,在一個磁碟分區內被認為是常數時間複雜度地操作。這個假設導致沒考慮跨分區的情況。


在非移動介質情況下可以設置臨時路徑為這樣就是直接解壓了!(吧


建議使用bandizip,不會出現這種問題


不同意頂樓說的。解壓到臨時目錄是為了避免解壓中失敗,可以不會留下之前解壓到一半的文件,而從臨時目錄再移動到目的地地址,其實是不需要真的文件移動的,只要改文件的指向就可以。但是,windows下蛋痛的是,你分區後,不同的driver之間移動文件還是要搬文件,要移動物理位置,這就導致了放臨時目錄再移動這種很傻的情況發生


推薦閱讀:

跨專業考哈工大計算機研究生應該怎樣準備?
歷史上最有名的電腦密碼是什麼?
Intel 14nm Core M 的發布意味著什麼?
不想用 360 了,電腦只用 Avira 可以嗎?
買一台好電腦的意義?

TAG:軟體 | 計算機 | 軟體設計 | 解壓縮 |