磁盤分析
本機的系統盤是C盤,操作系統是Windows 7 專業版,通過磁盤屬性可以看到C盤的已用空間是69.4G。

而我們運行自己編寫的腳本(腳本程序參考附錄,統計原理:計算目錄下各個文件的大小,然后相加,即為該目錄的大小;再將各個目錄占用空間相加,即為總的占用空間),可以發現,占用空間為59G。

計算機的“文件夾選項”中“顯示隱藏的文件、文件夾和驅動器”選項開關也是打開的。

因此,極有可能是存在某些系統級別的隱藏文件,腳本在統計磁盤占用空間時,沒有把這些文件統計上。我們使用磁盤修復分區工具DiskGenius進行分析,發現存在hiberfil.sys和pagefile.sys兩個隱藏文件。

其中,hiberfil.sys這個文件就是系統的休眠功能所占用的磁盤空間的文件,Windows默認休眠功能是處於打開狀態的,電腦處於休眠狀態時,內存中的所有內容將保存到硬盤。電腦在返回打開狀態之后,關閉電腦時,打開的所有程序和文檔將全部還原到桌面,參考鏈接1。
pagefile.sys這個文件是安裝過程中創建的虛擬內存頁面文件。如果計算機在較低的RAM下運行,並且立即需要更多的RAM,則Windows會用硬盤空間來模擬系統RAM,這就叫做虛擬內存,通常稱之為頁面文件,由於虛擬內存的設定,因此產生了pagefile.sys文件,參考鏈接2。
磁盤整理
由於系統空間緊張,因此我們可以關閉休眠,從而刪除hiberfil.sys這個文件,以及修改虛擬內存文件pagefile.sys的存放地址,存放在其他磁盤,從而避免將pagefile.sys占用系統磁盤空間。
1.刪除hiberfil.sys
刪除hiberfil.sys文件,主要是通過關閉休眠功能來實現,參考鏈接3。
在cmd窗口中敲入“powercfg -h off”命令后,即可關閉系統的休眠功能。

我們再用磁盤修復分區工具DiskGenius進行分析,發現hiberfil.sys已經不存在了。

2.修改pagefile.sys存放地址
修改pagefile.sys到其他空閑的磁盤中,參考鏈接4。
單擊“開始”-->右擊“計算機”-->“屬性”-->“高級系統設置”-->“高級”>性能欄里的“設置”-->“高級”>虛擬內存“更改”>取消“自動管理所有驅動器的分頁文件大小”。選擇C盤,點擊“無分頁文件”,點擊“設置”,再選擇D盤,點擊“系統管理的大小”,點擊“設置”,即可。

再用磁盤修復分區工具DiskGenius進行分析,發現pagefile.sys在D盤中出現。系統重新啟動后,C盤中已經不存在pagefile.sys文件了。
通過磁盤屬性可以看到C盤的已用空間是55.5G,比之前減少的13.9G。其中hiberfil.sys大小是5.9G,pagefile.sys大小是7.9G,共13.8G,也即我們上面兩步驟已經生效,減少了系統盤的占用空間。

3.大文件分析
我們通過運行自己編寫的腳本(腳本程序參考附錄,統計原理:計算各個文件的大小,並根據文件大小排序,將前20個最大的文件輸出)。

可以發現,紅框中的文件均為log文件。
這些日志都是提供有關脫機處理故障的詳細信息的處理日志文件,微軟官方不建議用戶自己刪除系統文件。因此這些文件,后續再處理,參考鏈接5。
具體實現
統計各個目錄占用空間,並按照目錄占用空間降序輸出;統計文件占用空間,並按照文件占用空間降序輸出前20個文件。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
#統計指定目錄下各個文件夾的大小,方便觀察具體目錄的大小
def CountDirSize(srcDir):
dirSizeDict = {}
fileSizeDict = {}
for fileList in os.listdir(srcDir):
filePath = os.path.join(srcDir,fileList)
if os.path.isdir(filePath):
size = 0
for roots,dirs,files in os.walk(filePath):
for fileName in files:
fileNamePath = os.path.join(roots,fileName)
sizetemp = 0
try:
sizetemp = os.path.getsize(fileNamePath)
if sizetemp > 1024*1024:
fileSizeDict[fileNamePath] = sizetemp
except:
sizetemp = 0
size += sizetemp
dirSizeDict[fileList] = size
#按照從大到小的順序降序排列
dirSizeDict = sorted(dirSizeDict.items(),key = lambda dirSizeDict:dirSizeDict[1],reverse = True)
Sum = 0
print "各個目錄占用空間"
for ele in dirSizeDict:
temp = ele[1]/1024/1024
Sum += temp
#以單位為M,輸出大小
print ele[0] + ":" + str(temp) + " M"
#以單位為G,輸出大小
print "Total use:" + str(Sum / 1024) +" G"
print ""
print "前20個大文件占用空間"
fileSizeDict = sorted(fileSizeDict.items(),key = lambda fileSizeDict:fileSizeDict[1],reverse = True)
for ele in fileSizeDict[:20]:
print ele[0] + ":" +str(ele[1]/1024/1024) + " M"
if __name__ == "__main__":
srcDir = "c:\\"
CountDirSize(srcDir)
