建立磁碟清除處理程式
計算機世界中一次又一次證明的一個公理是,無論計算機儲存容量的大小如何,您最終都會填滿它。 雖然計算機硬碟的平均大小隨著時間的大幅增加,但應用程式也隨之增加,讓用戶在尋找建立更多可用硬碟空間的方法。 由於備份或效能考慮,應用程式建立的許多暫存盤也會減少可用空間。 當磁碟空間變低時,需要減少應用程式所使用的空間量。 磁碟空間可以使用各種方式釋出,包括下列各項:
- 刪除檔案。
- 壓縮檔案。
- 將檔案移至備份媒體。
- 將檔案傳輸至遠端伺服器。
適合清除的檔案包括:
- 使用者不再需要的檔案。
- 僅基於效能考慮而存在的暫存盤。
- 可在需要時從安裝 CD 還原的檔案。
- 較新版本可能取代的數據檔,例如舊的備份檔。
- 長時間未使用的舊檔案。
刪除特別適用於使用者不再需要的檔案,例如,基於效能考慮而暫時快取的檔案。 刪除也適用於容易還原的檔案,例如可從安裝CD重載的圖形檔案。 使用者稍後可能需要或難以重建的檔案,是壓縮或備份的較佳候選專案。
預期使用者手動清除文件系統不是一個很好的解決方案。 使用者可能不知道許多檔案的位置,或如何辨識哪些檔案可以安全地移除。 此外,使用者可能會刪除基本檔案的風險。
本主題將討論磁碟清理工具的下列各個面向。
Windows 磁碟清除公用程式
從 Windows 98 開始,Windows作系統包含磁碟清除,這是一個公用程式,可讓使用者更輕鬆地管理可用的硬碟空間。 磁碟清除公用程式的設計目的是盡可能釋放磁碟空間,並降低使用者不小心刪除基本檔案的風險。
磁碟清除可以透過三種方式起始。
- 用戶可以按下 [開始] 來起始磁碟清除;指向 所有程式、配件及 System Tools;然後按下 [磁碟清理] 。
- 系統會透過消息框通知使用者未使用的磁碟空間已經達到臨界狀態。 大於 2.25 GB 的磁碟驅動器關鍵模式臨界值是 200 MB(MB)。 後續的警告為 80、50 和 1 MB。 用戶可以選擇手動釋放磁碟空間,或啟動磁碟清除公用程式。
- 用戶可以讓 Windows 排程工作精靈(稱為舊版系統上的維護精靈)自動在排程時間執行磁碟清除公用程式。
磁碟清除固有的基本挑戰是盡可能釋放磁碟空間,而不刪除基本檔案。 因為沒有標準方法來標記檔案以進行清除,因此沒有單一應用程式可以可靠地偵測及清除所有未清除檔案。 磁碟清理公用程式透過將清理操作分成單一的 磁碟清理管理員 和一組 磁碟清理處理程式來解決此問題。
執行磁碟清除公用程式時,使用者會看到下列對話方塊。 (如果計算機上存在多個磁碟或磁碟分區,使用者會先要求在顯示此對話方塊之前選擇磁碟驅動器。
磁碟清除管理員是作系統的一部分。 它會顯示上圖中顯示的對話框、處理使用者輸入,以及管理清除作業。 非必要檔案的實際選取和清除是由磁碟清除管理員清單框中顯示的個別磁碟清除處理程式所完成。 用戶可以選擇在磁碟清除管理員的 UI 中選取或清除其複選框,以啟用或停用個別處理程式。
每個處理程式都負責一組定義完善的檔案。 例如,圖例中選取的處理程式負責清除下載的程序檔案。 圖中選取的處理程式也會提供 [檢視檔案] 按鈕。 按兩下按鈕,使用者可以要求處理程式顯示UI通常是Windows檔案總管視窗,讓使用者指定要清除的檔案或類別。
雖然 Windows 隨附許多磁碟清除處理程式,但它們並非設計來處理其他應用程式所產生的檔案。 相反地,磁碟清除管理員的設計目的是讓任何開發人員實作並註冊自己的磁碟清除處理程式,以具彈性且可擴充性。 任何開發人員都可以藉由實作和註冊磁碟清除處理程式,來擴充可用的磁碟清除服務。
產生暫存盤的所有應用程式都可以實作並註冊磁碟清除處理程式。 這麼做可讓使用者以方便且可靠的方式管理應用程式的暫存盤。 當您實作處理程式時,您可以決定哪些檔案受到影響,並判斷實際清除的發生方式。
實作基本概念
清除處理程式是內部伺服器元件物件模型 (COM) 物件。 Windows 提供名為 DataDrivenCleaner 的現有處理程式物件,以供您使用。 您也可以選擇自行實作處理程式,以取得更大的彈性。 然後,這些物件可讓您指定如何選取檔案、釋放磁碟空間,以及在實作的處理程式的情況下,顯示選擇性 UI 以取得更細微的控制。 本節說明實作您自己的處理程式。 關於使用 DataDrivenCleaner 物件的詳細資訊,請參閱 使用 DataDrivenCleaner 物件。
磁碟清除處理程式應該執行這五項基本工作。
- 初始化處理程序物件。
- 掃描磁碟以判斷可以釋放多少磁碟空間。
- 顯示UI,以取得要清除哪些檔案的用戶意見反應。 (選擇性)
- 進行清除。
- 關閉
若要允許磁碟清理管理員管理這些工作,處理程式必須匯出 適用於 Windows 98 的 IEmptyVolumeCache,或適用於 Windows Millennium Edition、Windows 2000 和 Windows XP 的 IEmptyVolumeCache2。 由於 IEmptyVolumeCache2 繼承自 IEmptyVolumeCache,因此只新增其他方法 InitializeEx,實作兩者所需的額外工作相對較少。 除非您的處理程式只針對其中一個作業系統,否則它應該導出這兩個介面。
若要匯出這些介面,您必須實作這些方法,對應於五項基本工作。
Initialize/InitializeEx
執行磁碟清除公用程式時,會呼叫兩個相當類似的初始化方法。 Windows 98 磁碟清除管理員會呼叫處理程式的 IEmptyVolumeCache::Initialize 方法。 不過,Windows Millennium Edition (Windows Me)、Windows 2000 或 Windows XP 磁盘清除管理員會先嘗試呼叫 IEmptyVolumeCache2::InitializeEx,而且只會使用 IEmptyVolumeCache::Initialize,如果處理程式不會公開 IEmptyVolumeCache2。 磁碟清除管理員會將資訊傳遞至 方法,例如處理程式的登錄機碼和要清除的磁碟區。
任一種方法都可以傳回各種顯示字串,並設定一或多個旗標。 這兩種方法之間的主要差異在於如何處理磁碟清除管理員中顯示的文字。 下列三個字串受到影響。
字串 | 目的 | 初始化 | InitializeEx |
---|---|---|---|
顯示名稱 | 處理程式的名稱會顯示在磁碟清除管理員的清單框中。 | 如果 ppwszDisplayName 為 NULL,則會從登錄檔取得預設值。 | ppwszDisplayName 中必須指定正確本地化的字串, 不使用登錄值。 |
描述 | 選取處理程式名稱時,列表框下方顯示的描述性文字。 | 如果 ppwszDescription 是 NULL,則會從註冊表擷取預設值。 | ppwszDescription 中必須指定正確本地化的字串, 不使用登錄值。 |
按鈕文字 | 允許使用者顯示處理程式 UI 的選擇性按鈕文字。 | 沒有可用的參數。 必須在登錄中指定。 | ppwszBtnText 中必須指定正確本地化的字串, 不使用登錄值。 |
初始化方法中的 pdwFlags 參數可以辨識相同的旗標集。 這兩個旗標會由磁碟清除管理員傳遞至 方法。
EVCF_SETTINGSMODE
如果磁碟清除管理員正在排程執行,它會設定 EVCF_SETTINGSMODE 旗標。 如果設定此旗標,磁碟清除管理員不會呼叫 GetSpaceUsed、Purge或 ShowProperties 方法。 處理程式的 Initialize 或 InitializeEx 方法必須處理通常由 GetSpaceUsed 和 Purge執行的所有工作。 因為沒有機會提供使用者意見反應,因此應該只觸及那些非常安全且無法清除的檔案。 您應該忽略初始化方法的 pcwszVolume 參數,並清除不需要的檔案,而不論它們位於哪個磁碟驅動器上。
磁碟空間不足
如果已設定 EVCF_OUTOFDISKSPACE 旗標,則使用者的磁碟驅動器空間嚴重不足。 處理程式應該積極刪除檔案,即使導致效能遺失也一樣。 不過,處理程式顯然不應該刪除會導致應用程式失敗或使用者遺失資料的檔案。
其餘旗標是由磁碟清除處理程式所設定,並傳回至磁碟清除管理員。 如需詳細資訊,請參閱 IEmptyVolumeCache::Initialize 和 IEmptyVolumeCache2::InitializeEx的方法參考頁面。
EVCF_DONTSHOWIFZERO
只有當 GetSpaceUsed 的返回值顯示處理器可以釋放部分磁碟空間時,才會將其顯示在磁碟清理管理器的列表框中。
EVCF_ENABLEBYDEFAULT
此處理程式預設為啟用狀態。 除非使用者藉由清除磁碟管理員處理程式清單中的複選框來停用磁碟清除,否則它會在每次進行磁碟清除時執行。
EVCF_ENABLEBYDEFAULT_AUTO
指定處理常式會在排程清理作業期間自動啟用和執行。
EVCF_HASSETTINGS
如果您的處理程式有要顯示的使用者介面,請設置此旗標。 回應中,當清單框中選取該處理程式時,磁碟清除管理員會顯示按鈕。 如果按下該按鈕,磁碟清理管理員會呼叫 ShowProperties。
EVCF_REMOVEFROMLIST
在處理程式執行一次之後,從可用處理程式清單中刪除處理程序的名稱。 處理程式的登錄資訊也會一併刪除。
GetSpaceUsed
磁碟清除管理員會呼叫此方法,以判斷磁碟清除處理程式可能會釋放多少空間。 然後,磁碟清理管理員會在清單框中顯示於處理程式名稱右側的數值。 當管理員啟動時,以及在顯示管理員的主要UI之前,此作業會在向磁碟清除管理員註冊的所有處理程式上執行。 呼叫 GetSpaceUsed 時,處理程式應該掃描其負責的檔案、判斷其中哪一個是清除候選專案,並傳回可釋放的磁碟空間量。
因為掃描可能需要較長的時間,磁碟清除管理員會使用此方法的 picb 參數,將指標傳遞至 IEmptyVolumeCacheCallBack 介面。 處理程式會在掃描期間定期使用 介面來呼叫 IEmptyVolumeCacheCallBack::ScanProgress,其有兩個用途。
- 允許磁碟清除管理員更新進度列,告知使用者掃描進度。
- 通知處理程式在按下進度視窗的 [取消] 按鈕時停止掃描。 該按鈕事件不會直接傳達給處理程式;相反地,磁碟清除管理員會在下次 GetSpaceUsed 呼叫 IEmptyVolumeCacheCallBack::ScanProgress時,傳回E_ABORT。
顯示屬性
開始清除之前,處理程式通常會以 Windows 檔案總管視窗的形式顯示 UI,讓使用者能夠查看處理程式選取的檔案清單或檔案類別。 當呼叫 Initialize 或 InitializeEx 時,如果處理程式設置 EVCF_HASSETTINGS 旗標,使用者可以按一下磁碟清除管理員中針對該用途顯示的按鈕來要求 UI。 按鈕文字會因處理程式而異,但「檢視檔案」、「檢視頁面」和「選項」都是常見的標籤。
按下按鈕時,磁碟清理管理員會呼叫 ShowProperties,提示處理程式顯示使用者介面。 UI 應該建立為視窗的子系,其句柄會傳入 ShowProperties 方法的 hwnd 參數中。
徹底清除
磁碟清理管理員呼叫處理程式的 Purge 方法以啟動清理過程。 方法的 picb 參數是磁碟清除管理員 IEmptyVolumeCacheCallBack 介面的指標。 如同 GetSpaceUsed 方法,處理程式應該定期使用回呼介面來報告其進度,並查詢磁碟清理管理員,使用者是否已按一下 [取消] 。 不過,請注意,Purge 方法必須呼叫 IEmptyVolumeCacheCallBack::PurgeProgress,而不是 ScanProgress。
關閉
當磁碟清理管理員準備關閉時,會呼叫 Deactivate 方法。 處理程式應該執行任何必要的清除工作並傳回。 如果您不想再次執行處理程式,請在初始化方法的 pdwFlags 參數中設定 EVCF_REMOVEFROMLIST 旗標。 如果設定此旗標,磁碟清除管理員會從其清單中移除處理程式,並刪除處理程式的登錄專案。 您必須重新新增登錄項目,才能再次執行處理程式。 此旗標通常用於只執行一次的處理程式。
註冊磁碟清除處理程式
若要將處理程序新增至磁碟清理管理員的清單,需在 Windows 登錄中新增特定的機碼和值。
- 註冊處理程式的CLSID
- 向磁碟清除管理員註冊處理程式:一般
- 使用磁碟清除管理員註冊處理程式:Windows 2000 或更新版本系統
- 使用 DataDrivenCleaner 物件
- 磁碟清除處理程式 的範例註冊
註冊處理程式的 CLSID
如同所有 COM 物件,處理程式物件的 GUID 和 DLL 必須在 HKEY_CLASSES_ROOT中的 CLSID 機碼下註冊。 您也可以在磁碟清理管理員的列表中註冊一個在處理程式名稱旁邊顯示的圖示,但這是可選的。 下列範例展示鍵、值和數據。
HKEY_CLASSES_ROOT
CLSID
Handler's GUID
DefaultIcon
(Default) = Handler's Icon Path, Icon Index
InprocServer32
(Default) = Handler's DLL path
ThreadingModel = Apartment
向磁碟清除管理員註冊處理程式:一般
若要完成註冊,處理程式必須新增保存其特定數據的密鑰,如下所示。 本節的其餘部分將討論此密鑰的內容。
HKEY_LOCAL_MACHINE
Software
Microsoft
Windows
CurrentVersion
Explorer
VolumeCaches
Handler's Key
一般而言,保存處理程序詳細資訊的鍵名稱通常會根據其處理的檔案類型命名,例如 下載的程式檔案,但這並非必要條件。 下表詳述此索引鍵下可能的值。
注意
指定處理程式類別識別碼(CLSID)的預設值是必需的,其他所有值都是選擇性的。
價值 | 類型 | 意義 |
---|---|---|
預設 | REG_SZ | 處理程式的 CLSID,在 CLSID HKEY_CLASSES_ROOT\底下註冊,。 |
高級按鈕文本 | REG_SZ | 用戶可以按下以顯示處理程式 UI 的選擇性按鈕文字。 您可以在字元之前放置 & 字元,以指派按鈕的鍵盤快捷方式。 公開 IEmptyVolumeCache2::InitializeEx的處理程式會忽略 AdvancedButtonText 值。 |
CleanupString | REG_SZ | 指定可執行文件和選擇性命令行參數的命令行。 此命令行會在完成磁碟清除時執行。 |
CSIDL | REG_DWORD | 系統無關的識別碼,用於包含在檔案搜尋中的特殊資料夾。 此值必須輸入為數值,例如,0x0000001c而不是CSIDL_LOCAL_APPDATA。 如需可能值的清單,請參閱 CSIDL。 只能使用單一值。 如果指定了 Folder 值,系統會將 CSIDL 值所指示的位置加到該資訊的前面,以組成搜尋路徑。 例如,請考慮下列案例。
|
描述 | REG_SZ | 當選取處理程式名稱時,在磁碟清除管理員的清單框下方顯示的描述性文字。 您可以在這裡說明處理程式的功能、它所涉及的檔案,以及任何其他能幫助使用者理解的資訊。 如果處理程式未公開 IEmptyVolumeCache2 的 InitializeEx 方法,則可以透過處理程式的 IEmptyVolumeCache 的 Initialize 方法來覆寫此文字,方法是在呼叫方法時在 ppwszDescription 參數中指定替代字串。 |
顯示 | REG_SZ | 要顯示在磁碟清除管理員清單框中的處理程式名稱。 如果處理程式未公開 IEmptyVolumeCache2::InitializeEx,則可以在透過處理程式的 IEmptyVolumeCache::Initialize 方法覆寫此文字時,呼叫方法時於 ppwszDisplayName 參數中指定替代字串。 |
檔案列表 | REG_SZ或REG_MULTI_SZ | 此處理程式搜尋並清除的檔案清單。 您可以使用「?」來指定通配符。 或 * 字元。 如果值的類型為 REG_SZ,則使用 | 或 : 字元分隔多個延伸模組,並且其中任一端沒有空格。 如果在 Flags 值中設定DDEVCF_REMOVEDIRS旗標,這些值可以指定目錄名稱和檔案。 |
標誌 | REG_DWORD或REG_BINARY | 旗標控制搜尋和清除程序的元素。 下列一或多個值。
|
資料夾 | REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ | 指定要搜尋符合 FileList 值中的項目之特定資料夾或資料夾。 您可以使用「?」來指定通配符。 或 * 字元。 如果值的類型為 REG_SZ,則多個資料夾名稱之間用 | 字元分隔,且字元兩側沒有空格。 如果 CSIDL 值存在,則這個值中只能指定一個資料夾。 CSIDL 值所指示的位置會被加到該資料夾路徑的前面,以構成一個搜尋路徑。 如需範例,請參閱 CSIDL 值描述。 如果 Windows Vista Service Pack 1 (SP1) 和更新版本沒有此值,則會忽略清除處理程式,並在初始化時傳回S_FALSE。 如果原始版本的 Windows Vista 和更早版本上沒有這個值,則會使用目前磁碟區的根資料夾。 在此情況下,需要DDEVCF_DOSUBDIRS旗標來搜尋整個磁碟驅動器。 如果沒有它,只會搜尋根資料夾本身。 必須指定一個或多個磁碟驅動器。 這可以透過 CSIDL 值或透過REG_EXPAND_SZ字串來提供。 若沒有這些選項,則必須在資料夾名稱中指定要搜尋的驅動器。 使用 ?: 來搜尋目前磁碟驅動器上的資料夾。 |
IconPath (圖示路径) | REG_SZ或REG_EXPAND_SZ | 要從中取得要與處理程序關聯之圖示的資源路徑。 |
LastAccess | REG_DWORD 或 REG_BINARY | 距離檔案上次存取或目錄創建後,必須經過的天數,才能將該檔案或目錄列入清理考量。 |
優先權 | REG_DWORD或REG_BINARY | 決定處理程式相對於其他處理程式執行的順序。 號碼越高,處理程序越早執行。 沒有任何定義的範圍,任何數位都可以接受。 |
PropertyBag | REG_SZ | 用於提供顯示名稱、描述以及按鈕文字的當地語系化文字的資源 CLSID。 此資源適用在處理程序未實作 IEmptyVolumeCache 的情況下,且處理程序正在 Microsoft Windows NT 或 Windows XP 下執行。 磁碟清除管理員會先檢查處理程式的初始化例程是否傳回這些字串,就像實作 IEmptyVolumeCache2 時的情況一樣。 如果失敗,管理員接著會轉向這個值中名為 |
州旗 | REG_DWORD | 從命令行執行磁碟清除管理員的可執行檔 Cleanmgr.exe,可以定義清除配置檔 。 這些配置檔是由可用處理程式的子集所組成,並提供唯一的數值標籤。 這可讓您在不同時間自動執行不同的處理程式集。 命令行「cleanmgr.exe /sageset:nnnn」,其中 nnnn 是一個唯一的數值標籤,會顯示一個用戶介面,讓您選擇要包含在該配置檔中的處理程式。 除了定義設定檔,sageset 參數還會將名為 StateFlags 的值寫入nnnn,其中 nnnn 是您在參數中使用的標籤,寫入到 VolumeCaches 下的所有子機碼。 這些條目有兩個可能數據值。
例如,假設命令行 「cleanmgr.exe /sageset:1234」 正在執行。 在顯示的 UI 中,使用者選擇 [下載的程式檔],但不選擇 [暫存因特網檔案]。 然後,下列值會寫入登錄。
命令行 「cleanmgr.exe /sagerun:nnnn」。,其中 nnnnn 的值與 sageset 參數所宣告的標籤相符,會執行該配置檔中選取的所有處理程式。 一般 StateFlags 值會在正常執行磁碟清理時寫入登錄。 此值只會在最後一次向用戶呈現為選項時,儲存處理程式的狀態(已核取或未核取)。 這些條目有兩個可能的資料值。
|
向磁碟清除管理員註冊處理程式:Windows 2000 或更新版本系統
在登錄中指定顯示文字可能會使軟體難以當地語系化。 基於這個理由,Windows 2000 和 Windows XP 支援 IEmptyVolumeCache2 介面,其慣用初始化方法 InitializeEx。 使用 Windows 2000 或更新版本時,通常會先嘗試呼叫 IEmptyVolumeCache2::InitializeEx,再呼叫 IEmptyVolumeCache::Initialize。 如果 IEmptyVolumeCache2 未公開,系統只會使用 Initialize 來初始化處理程式。
就登錄而言,Windows 2000 或更新版本下的唯一差異在於,當處理程式公開 IEmptyVolumeCache2::InitializeEx 時,您可以省略 AdvancedButtonText、Display 和 Description 值。 這些值,包含正確本地化的文字,會在呼叫 initializeEx 時提供給磁碟清除管理員。
使用 DataDrivenCleaner 物件
作系統會提供稱為 DataDrivenCleaner 的基本磁碟清除處理程式。 若要使用此物件做為處理程式,而不是實作您自己的處理程式,請使用 CLSID {C0E13E61-0CC6-11d1-BBB6-0060978B2AE6} 作為 VolumeCaches 下處理程式子機碼的預設值,如 使用磁碟清理管理員註冊處理程式:一般中所述。
DataDrivenCleaner 不會公開 IEmptyVolumeCache2,因此顯示和描述值會透過登錄提供。 宣告這些字串時,請注意這可能會導致當地語系化問題。 本地化的文字可以透過 PropertyBag 值提供。 AdvancedButtonText 值會被忽略,因為針對此處理程式,沒有 UI,因此亦無可用來顯示的按鈕。
磁碟清除處理程式的範例註冊
以下顯示電話公司所實作磁碟清除處理程式的範例註冊。 此處理程式實作了 IEmptyVolumeCache 和 IEmptyVolumeCache2,因此在可能於執行 Windows 98 的電腦上使用時,會提供 AdvancedButtonText、Description 和 Display 的值。 處理程式會結合 CSIDL 和 Folder 值來搜尋 C:\Program Files\The Phone Company\Temp 目錄中的檔案,並設定DDEVCF_DOSUBDIRS旗標,以便搜尋其子目錄。 只有副檔名為 .tmp 和 .tpc 的檔案會被考慮是否需要清理,並且會設定 DDEVCF_PRIVATE_LASTACCESS 旗標,以便在這些檔案中,只考慮那些已超過14天未被存取的檔案。 也會設定DDEVCF_DONTSHOWIFZERO旗標,因此處理程式不會出現在清單中,除非它找到了需清理的候選項目。
HKEY_LOCAL_MACHINE
Software
Microsoft
Windows
CurrentVersion
Explorer
VolumeCaches
The Phone Company Files
(Default) = {the CLSID GUID}
AdvancedButtonText = &View Files
CleanupString = c:\tpc.exe
CSIDL = 0x00000026
Description = Old temporary files.
Display = The Phone Company Files
FileList = *.tmp|*.tpc
Flags = 0x10000021
Folder = \The Phone Company\Temp
IconPath = c:\Program Files\The Phone Company\tpc.dll,2
LastAccess = 0x0000000e
Priority = 200
PropertyBag = {Property Bag CLSID GUID}