如上图,

很好奇 C 盘的空间都去哪了,

好像系统没有特别方便的自带的插件,

于是在回家的 29 小时快速列车上搓了个简单的统计内存的程序 qwq

结果如下图:

经典 Windows 占超过 C 盘的 25%

至于 136.58 > 119,

感觉是因为用了一些软链接,

还有万恶之源 AppData!

这个 netease 网易什么鬼???

(补充:之后特意翻了一下这个目录,发现是影之诗((qwq 删了删了)

(吐槽续:而且这玩意我记得我当初是装在 D 盘的,但是你把软件的数据十几个 G 的往 C 盘塞这谁受得了)

这些大文件之后一个个清算(!

程序附在这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
'''
@author: Mofianger
@description: A python script used to analyze storage occupation.
@version: 1.0
@published date: 2024/07/22
@last updated: 2024/07/22
'''
import os
import argparse
import pickle
import tqdm

class Node:
def __init__(self, dir, name):
self.dir = dir
self.name = name
self.size = 0
self.children = []
self.transverse()
self.sort_by_size()
# self.sort_by_name()

def sort_by_size(self):
self.children.sort(key=lambda x: x.size, reverse=True)

def sort_by_name(self):
self.children.sort(key=lambda x: x.name)

def add_children(self, child):
self.children.append(child)

def transverse(self):
path = self.dir
# print(path)
try:
if os.path.isdir(path):
self.isdir = True
all_files = os.listdir(path)
for f in all_files:
file_path = os.path.join(path, f)
child = Node(file_path, f)
self.add_children(child)
self.size += child.size
else:
self.size += os.path.getsize(path)
self.isdir = False
except Exception as e:
# print(e)
self.size = -1

def display(self, depth=0, max_depth=1, saving = False):
if max_depth!=-1 and depth > max_depth:
return
print("\t"*depth, end="")
print(Node.easy_read(self.name)," ", Node.readable_size(self.size))
for child in self.children:
child.display(depth+1, max_depth, saving)

def display_all(self):
self.display(depth=0, max_depth=-1)

def readable_size(size):
if size == -1:
return f"error XD"
if size >= 1024**3:
return f"{size / (1024 ** 3):.2f} GB"
elif size >= 1024**2:
return f"{size / (1024 ** 2):.2f} MB"
else:
return f"{size / 1024:.2f} KB"

def easy_read(name, length=32):
name = name[:length]
tot = 0
out_len = length
for i,c in enumerate(name):
# print(i, c)
tot += (1 + (int)(ord(c)>128))
if tot>length:
out_len = i
tot -= (1 + (int)(ord(c)>128))
break
# print("tot:",tot)
# print(out_len, tot)
return name[:out_len] + " "*(length-tot)



if __name__ == '__main__':
parser = argparse.ArgumentParser(description="统计每个文件夹的大小")
parser.add_argument(
"--dir", type=str, default="D:/", help="指定要统计的目录,默认为D盘根目录"
)
parser.add_argument(
"--max_depth", type=int, default=1, help="显示的层数"
)
parser.add_argument(
"--save", action="store_true", default=False, help="是否保存"
)
parser.add_argument(
"--write_file", type = str, default="data", help="存储的文件名"
)
parser.add_argument(
"--read", action="store_true", default=False, help="是否从本地读取文件"
)
parser.add_argument(
"--read_file", type=str, default="data", help="从本地读取存储文件"
)
args = parser.parse_args()

if args.read:
with open(args.read_file+".sc", 'rb') as f:
root = pickle.load(f)
else:
root = Node(args.dir, "root")
max_depth = args.max_depth
if max_depth <0:
root.display_all()
else:
root.display(max_depth = max_depth)
if args.save:
with open(args.write_file+".sc", 'wb') as f:
pickle.dump(root, f)

后续一些功能,比如说

  • 添加 tqdm 的进度条
  • 将保存的文件按指定路径展开指定深度
  • GUI 界面
  • 压缩保存文件的大小
  • 信息的安全
  • error XD 的处理