建立磁片清除處理常式
電腦世界中一次經過證實的一個解說是,不論電腦儲存容量的大小為何,您最終都會填滿它。 雖然電腦硬碟的平均大小隨著時間大幅增加,但應用程式也會隨之成長,讓使用者想要建立更多可用硬碟空間的方式。 應用程式基於備份或效能考慮而建立的許多暫存檔案也會減少可用空間。 當磁碟空間變低時,需要減少應用程式所使用的空間量。 可用各種方式釋放磁碟空間,包括下列各項:
- 刪除檔案。
- 壓縮檔案。
- 將檔案移至備份媒體。
- 將檔案傳送至遠端伺服器。
適合清除的檔案包括:
- 使用者永遠不需要的檔案。
- 僅基於效能考慮而存在的暫存檔。
- 視需要從安裝 CD 還原的檔案。
- 可能已被較新版本取代的資料檔案,例如舊的備份檔案。
- 長時間未使用的舊版檔案。
刪除特別適用于使用者永遠不會再次需要的檔案,例如,基於效能考慮暫時快取的檔案。 刪除也適用于容易還原的檔案,例如可從安裝 CD 重載的圖形檔案。 使用者稍後可能需要的檔案,或難以重新建構的檔案,是壓縮或備份的較佳候選項目。
預期使用者手動清除檔案系統不是理想的解決方案。 使用者可能不知道有多少檔案位於何處,或如何辨識哪些檔案可以安全地移除。 此外,使用者可能會刪除基本檔案的風險。
本主題將討論磁片清除公用程式的下列 Facet。
Windows 磁片清除公用程式
從 Windows 98 開始,Windows 作業系統包含磁片清除,這是一個公用程式,可讓使用者更輕鬆地管理可用的硬碟空間。 磁片清除公用程式的設計目的是盡可能釋放磁碟空間,並降低使用者不小心刪除基本檔案的風險。
磁片清除可以透過三種方式起始。
- 使用者可以按一下 [ 開始] 來起始磁片清除;指向 所有程式、 配件和 系統工具;然後按一下 [磁片清除]。
- 系統會向使用者通知未使用的磁碟空間已達到重大模式的訊息方塊。 磁片磁碟機大於 2.25 GB (GB) 的重要模式閾值為 200 MB (MB) 。 後續的警告會在 80、50 和 1 MB 時提供。 使用者可以選擇手動釋放磁碟空間,或啟動磁片清理公用程式。
- 使用者可以讓 Windows 排程工作精靈 (稱為舊系統上的維護精靈,) 在排程時間自動執行磁片清除公用程式。
磁片清理固有的基本挑戰是盡可能釋放磁碟空間,而不需要刪除基本檔案。 因為沒有標準的方式來標記檔案以進行清除,所以沒有單一應用程式可以可靠地偵測和清除所有非經常性檔案。 磁片清除公用程式藉由在單一磁片清除管理員與磁片清除處理常式集合之間分割清除作業來解決此問題。
執行磁片清除公用程式時,使用者會看到下列對話方塊。 (如果電腦上存在多個磁片或磁碟分割,使用者必須先選擇磁片磁碟機,再顯示此對話方塊。)
磁片清除管理員是作業系統的一部分。 它會顯示上圖所示的對話方塊、處理使用者輸入,以及管理清除作業。 非必要檔案的實際選取和清除是由磁片清除管理員清單方塊中顯示的個別磁片清除處理常式所完成。 使用者可以選擇在磁片清除管理員 UI 中選取或清除其核取方塊,以啟用或停用個別處理常式。
每個處理常式都會負責一組定義完善的檔案。 例如,圖例中選取的處理常式負責清除下載的程式檔案。 圖中選取的處理常式也會提供 [ 檢視檔案 ] 按鈕。 按一下按鈕,使用者可以要求處理常式顯示 UI 通常是 Windows 檔案總管視窗,讓使用者指定要清除的檔案或類別。
雖然 Windows 隨附許多磁片清除處理常式,但並非設計來處理其他應用程式所產生的檔案。 相反地,磁片清除管理員的設計目的是要有彈性且可延伸,方法是讓任何開發人員實作並註冊自己的磁片清除處理常式。 任何開發人員都可以藉由實作和註冊磁片清除處理常式來擴充可用的磁片清除服務。
產生暫存檔的所有應用程式都可以實作並註冊磁片清除處理常式。 這麼做可讓使用者以方便且可靠的方式管理應用程式的暫存檔。 當您實作處理常式時,您可以決定哪些檔案受到影響,並判斷實際清除的發生方式。
實作基本概念
清除處理常式是進程伺服器元件物件模型, (COM) 物件。 Windows 提供名為 DataDrivenCleaner 的現有處理常式物件以供使用。 您也可以選擇自行實作處理常式,以取得更多彈性。 然後,這些物件可讓您指定如何選取檔案、釋放磁碟空間,以及在實作的處理常式的情況下,顯示選擇性 UI 以取得更細微的控制。 本節說明實作您自己的處理常式。 如需使用 DataDrivenCleaner 物件的詳細資訊,請參閱 使用 DataDrivenCleaner 物件。
磁片清除處理常式應該執行這五項基本工作。
- 初始化處理常式物件。
- 掃描磁片,以判斷可以釋放多少磁碟空間。
- 顯示 UI,以取得要清除哪些檔案的使用者意見反應。 (選用)
- 執行清除。
- [關閉]。
若要允許磁片清除管理員管理這些工作,處理常式必須匯出適用于 Windows 98 的 IEmptyVolumeCache 或 Windows Premium Edition 的 IEmptyVolumeCache2 (Windows Me) 、Windows 2000 和 Windows XP。 由於 IEmptyVolumeCache2 繼承自 IEmptyVolumeCache,因此只新增其他方法 InitializeEx,因此實作這兩者所需的額外工作相當少。 除非您的處理常式僅適用于其中一個作業系統,否則它應該匯出這兩個介面。
若要匯出這些介面,您必須實作這些對應至五個基本工作的方法。
Initialize/InitializeEx
執行磁片清除公用程式時,會呼叫兩個相當類似的初始化方法。 Windows 98 磁片清除管理員會呼叫處理常式的 IEmptyVolumeCache::Initialize 方法。 Windows Premium Edition (Windows Me) 、Windows 2000 或 Windows XP 磁片清除管理員,不過,會先嘗試呼叫IEmptyVolumeCache2::InitializeEx,而且只有在處理常式未公開IEmptyVolumeCache2時,才會使用初始化。 磁片清除管理員會將資訊傳遞至 方法,例如處理常式的登錄機碼和要清除的磁片區。
任一方法都可以傳回各種顯示字串,並設定一或多個旗標。 這兩種方法的主要差異在於如何處理磁片清理管理員中顯示的文字。 下列三個字串受到影響。
String | 目的 | Initialize | InitializeEx |
---|---|---|---|
顯示名稱 | 處理常式的名稱會顯示在磁片清除管理員的清單方塊中。 | 如果 ppwszDisplayName 為 Null,則會從登錄擷取預設值。 | 在 ppwszDisplayName 中必須指定正確當地語系化的字串,不會使用任何登錄值。 |
Description | 選取處理常式的名稱時,清單方塊下方顯示的描述性文字。 | 如果 ppwszDescription 為 Null,則會從登錄擷取預設值。 | 在 ppwszDescription 中必須指定正確當地語系化的字串,不會使用登錄值。 |
按鈕文字 | 選擇性按鈕的文字,可讓使用者顯示處理常式的 UI。 | 沒有可用的參數。 必須在登錄中指定。 | 在 ppwszBtnText 中必須指定正確當地語系化的字串,不會使用登錄值。 |
在兩個初始化方法中找到的 pdwFlags 參數可辨識相同的旗標集。 這兩個旗標會由磁片清除管理員傳遞至 方法。
EVCF_SETTINGSMODE
如果磁片清除管理員正在排程執行,它會設定 EVCF_SETTINGSMODE 旗標。 如果設定此旗標,磁片清除管理員不會呼叫 GetSpaceUsed、 Purge或 ShowProperties 方法。 處理常式的 Initialize 或InitializeEx方法必須處理GetSpaceUsed和Purge正常執行的所有工作。 因為使用者意見反應沒有機會,所以應該只觸及最安全清除的檔案。 您應該忽略初始化方法的 pcwszVolume 參數,並清除不需要的檔案,而不論它們位於哪個磁片磁碟機上。
EVCF_OUTOFDISKSPACE
如果 已設定EVCF_OUTOFDISKSPACE 旗標,使用者的磁片磁碟機會大幅縮短空間。 即使處理常式造成效能遺失,處理常式也應該積極刪除檔案。 不過,處理常式顯然不應該刪除會導致應用程式失敗或使用者遺失資料的檔案。
其餘旗標是由磁片清除處理常式設定,並返回磁片清除管理員。 如需詳細資訊,請參閱 IEmptyVolumeCache::Initialize 和 IEmptyVolumeCache2::InitializeEx的方法參考頁面。
EVCF_DONTSHOWIFZERO
只有在 GetSpaceUsed 傳回的值指出處理常式可以釋放某些磁碟空間時,才會在磁片清除管理員的清單方塊中顯示處理常式。
EVCF_ENABLEBYDEFAULT
指定預設會啟用處理常式。 除非使用者透過清除磁片管理員處理常式清單中的核取方塊來停用磁片清理,否則每次進行磁片清理時都會執行。
EVCF_ENABLEBYDEFAULT_AUTO
指定處理常式會在排程清除期間自動啟用以執行。
EVCF_HASSETTINGS
如果您的處理常式有要顯示的 UI,請設定此旗標。 回應中,磁片清除管理員會在清單方塊中選取該處理常式時顯示按鈕。 如果按一下該按鈕,磁片清除管理員會呼叫 ShowProperties。
EVCF_REMOVEFROMLIST
在處理常式執行一次之後,從可用處理程式清單中刪除處理常式的名稱。 處理常式的登錄資訊也會被刪除。
GetSpaceUsed
磁片清除管理員會呼叫這個方法,以判斷磁片清除處理常式可能會釋放多少空間。 然後,磁片清除管理員會在清單方塊中顯示處理常式名稱右邊的值。 當管理員啟動時,以及管理員的主要 UI 顯示之前,此作業會在所有向磁片清除管理員註冊的處理常式上執行。 呼叫 GetSpaceUsed 時,處理常式應該掃描其負責的檔案、判斷哪些檔案是清除候選項目,並傳回可釋放的磁碟空間量。
由於掃描可以是冗長的程式,所以磁片清除管理員會使用此方法的 picb 參數,將指標傳遞至 IEmptyVolumeCacheCallBack 介面。 處理常式會在掃描期間定期使用 介面來呼叫 IEmptyVolumeCacheCallBack::ScanProgress,其用途為兩個。
- 允許磁片清除管理員更新進度列,通知使用者掃描的進度。
- 通知處理常式在按一下進度視窗的 [ 取消 ] 按鈕時停止掃描。 該按鈕事件不會直接與處理常式通訊;相反地,磁片清除管理員會在下次 GetSpaceUsed 呼叫 IEmptyVolumeCacheCallBack::ScanProgress時傳回E_ABORT。
ShowProperties
開始清除之前,處理常式通常會以 Windows 檔案總管視窗的形式顯示 UI,讓使用者查看處理常式選取的檔案清單或檔案類別。 如果處理常式在呼叫Initialize或InitializeEx時設定EVCF_HASSETTINGS旗標,使用者可以按一下磁片清除管理員中顯示的按鈕來要求 UI。 按鈕文字會因處理常式而異,但「檢視檔案」、「檢視頁面」和「選項」是常見的標籤。
按一下按鈕時,磁片清除管理員會呼叫 ShowProperties 來提示處理常式顯示 UI。 UI 應該建立為視窗的子系,其控制碼會傳入 ShowProperties 方法的 hwnd 參數中。
清除
磁片清除管理員會呼叫處理常式的 Purge 方法,以設定動作中的清除。 方法的 picb 參數是磁片清除管理員 IEmptyVolumeCacheCallBack 介面的指標。 如同 GetSpaceUsed 方法,處理常式應該定期使用回呼介面來報告進度,並查詢磁片清除管理員,使用者是否已按一下 [ 取消]。 不過,請注意 ,Purge 方法必須呼叫 IEmptyVolumeCacheCallBack::P urgeProgress,而不是 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\ 。 |
AdvancedButtonText | REG_SZ | 使用者可以按一下以顯示處理常式 UI 之選擇性按鈕的文字。 &字元可以放在要指派按鈕鍵盤快速鍵的字元之前。 公開 IEmptyVolumeCache2::InitializeEx的處理常式會忽略 AdvancedButtonText 值。 |
CleanupString | REG_SZ | 指定可執行檔和選擇性命令列參數的命令列。 此命令列會在磁片清除完成時執行。 |
CSIDL | REG_DWORD | 要包含在檔案搜尋中之特殊資料夾的系統獨立識別碼。 此值必須輸入為數值,例如,0x0000001c而不是CSIDL_LOCAL_APPDATA。 如需可能值的清單,請參閱 CSIDL。 只能使用單一值。 如果指定 Folder 值,CSIDL 值所指示的位置會附加到該資訊以撰寫搜尋路徑。 例如,請考慮下列案例。
|
Description | REG_SZ | 選取處理常式的名稱時,顯示在磁片清除管理員清單方塊下方的描述性文字。 您可以在這裡說明處理常式的功能、其本身所關注的檔案,以及向使用者提供的任何其他資訊。 如果處理常式未公開IEmptyVolumeCache2::InitializeEx,您可以在呼叫 方法時,透過處理常式的IEmptyVolumeCache::Initialize方法覆寫此文字。 |
顯示 | REG_SZ | 要顯示在磁片清理管理員清單方塊中的處理常式名稱。 如果處理常式未公開IEmptyVolumeCache2::InitializeEx,您可以在呼叫 方法時,透過處理常式的IEmptyVolumeCache::Initialize方法覆寫此文字。 |
FileList | REG_SZ或REG_MULTI_SZ | 此處理程式所搜尋和清除的檔案清單。 您可以使用 指定萬用字元? 或 * 字元。 如果值的類型為 REG_SZ,則會使用 分隔多個延伸模組 |或 :字元,其中任一端沒有空格。 如果在 Flags 值中設定DDEVCF_REMOVEDIRS旗標,這些值可以指定目錄名稱和檔案。 |
Flags | 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 的情況一樣。 失敗,管理員接著會變成這個值中名為 的屬性包。 如果沒有提供,它會從登錄擷取文字。 |
StateFlags | REG_DWORD | 從命令列執行磁片清理管理員的可執行檔Cleanmgr.exe,即可宣告清除 設定檔。 這些設定檔是由可用處理程式的子集所組成,並提供唯一的數值標籤。 這可讓您在不同的時間自動執行不同的處理常式集。 命令列 「cleanmgr.exe /sageset:nnnn」,其中 nnnn 是唯一的數值標籤,會顯示 UI,可讓您選擇要包含在該設定檔中的處理常式。 除了定義設定檔,sageset 參數也會將名為 StateFlagsnnnn的值寫入至VolumeCaches底下的所有子機碼,其中nnnn是您在 參數中使用的標籤。 這些專案有兩個可能的資料值。
例如,假設執行命令列 「cleanmgr.exe /sageset:1234」。 在顯示的 UI 中,使用者選擇 [已下載的程式檔],但不選擇 [暫存網際網路檔案]。 下列值接著會寫入登錄。
命令列 「cleanmgr.exe /sagerun:nnnn」,其中 nnnn 的值符合以 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,因此會透過登錄提供 Display 和 Description 值。 宣告這些字串時,請注意這可能會導致當地語系化問題。 您可以透過 PropertyBag 值來提供當地語系化的文字。 系統會忽略 AdvancedButtonText 值,因為沒有 UI,因此沒有顯示它的按鈕,所以這個處理常式無法使用。
磁片清理處理常式的範例註冊
以下顯示電話公司所實作之磁片清除處理常式的範例註冊。 此處理程式會實作 IEmptyVolumeCache 和 IEmptyVolumeCache2,因此提供 AdvancedButtonText、Description 和 Display 值,以防用於執行 Windows 98 的電腦上。 處理常式會結合 CSIDL 和 Folder 值來搜尋 C:\Program Files\The Phone Company\Temp 目錄中的檔案,並設定DDEVCF_DOSUBDIRS旗標,以便搜尋其子目錄。 只有具有 .tmp 和 .tpc 副檔名的檔案會被視為清除,而且會設定 DDEVCF_PRI加值稅E_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}