粗一看这是个简单的问题,仔细一想,事情并没有那么简单。
首先我说另外个事:
平时我删文件也是秒删的,因为我一般会启用回收站,并且去掉【确认删除】的对话框。因此只要目录尺寸不超过回收站大小,点击删除键一定就是秒删。
回收站秒删的原理在于:它只删除了父目录,目录内的所有文件跟子目录根本就不需要动。因此无论目录有多大,里面有多少个文件,删除的都只有最高一级目录,无论目录有多大都等同于只删除了一个单一文件,所以回收站删除会比删除几千个文件要快。
——
现在来说题主的问题,题主的问题是删80G的游戏,而这个游戏的空间大于大多数用户的回收站大小,因此正常情况下,它的删除必定会触发真正的删除流程,要删除的文件如果很多,就会稍微慢一些。但 steam 删除得很快,推测有几种可能:
具体哪种可能,题主自己研究一下具体情况吧。
这个问题下截止到目前的回答还没看到一个特别准确的。
既然是80G的Steam游戏,默认操作系统是Windows,文件系统是NTFS。Windows支持的其它文件系统,FAT/FAT32分区最大只有8G/32G(理论上FAT32分区大小可以是2T,但Windows不允许用FAT32格式化大于32G的分区),放不下80G的游戏,exFAT默认只能用来格式化移动存储设备不能用来格式化固定磁盘,所以这个问题下用FAT来解释的回答大概率都是错的。ReFS估计没几个人在用吧?
在NTFS分区里面,一个文件,根据文件大小的不同,有3处或者5处相关的信息:
根据第1项的说明,如果文件夹数据/文件大小很小的话,上面4、5两项是没有的。如果是簇大小为4K的NTFS分区,80G的文件在$bitmap中占用80×1024×1024÷4=20Mbit=2.5MB。如果考虑到这些簇可能散乱分布在整个分区中的不同位置,需要把整个$Bitmap文件更新一遍的话,一个1TB的分区的$Bitmap文件是32MB。
所以,每删除一个文件/文件夹,都要更新1~4项的信息。第5项无需更新,文件所使用的簇在$Bitmap中对应的位置0后,将来如果这些簇用来保存新的文件数据会直接覆盖。当然,如果是使用固态硬盘的话,Windows会发送trim指令给固态的主控,主控会在空闲的时候根据磨损算法回收对应的Page。
如果是机械硬盘的话,在没有缓存的前提下,单是找到1~3项的记录通常就需要十多次寻道。每一处记录的更新必然有一次寻道,但对于固态来说只要文件数量不是太多,这个寻道(固态其实应该叫寻址更合适点)时间都可以在1秒内完成。而每一处信息更新通常只需要写入1簇(4K)的数据,就算是机械硬盘,这个数据传输时间也是基本可以忽略的,固态就更不用说了。
最后,根据前面的论述,如果一个游戏有1024个文件的话,写入数据量是1024×12KB=12MB,加上$Bitmap文件的2.5~32MB,总计是14.5MB~44MB。SATA固态硬盘通常4K随机读性能在20MB/s以上,4K写性能100MB/s以上,在这些数据都在缓存中的前提下,还是可以在1秒内完成的。如果文件数量更少,就更加没有压力了。
某些回答里面猜测的这些索引记录是否会在Steam安装游戏的时候使用预分配空间是使得这些记录集中在一起,我可以肯定不是。下图中灰色底色的行是我电脑上的Steam里面泰坦之旅这个游戏的文件夹以及文件夹下若干个文件的起始簇编号、扇区地址:
可以看到,这几个文件/文件夹不管是$MFT记录号还是簇编号,都并不连续。另外,这个游戏的文件加上目录数量不超过600。
Steam能做的,估计是把这些记录所在的扇区缓存到内存中,减少读取数据的寻道/寻址次数。毕竟前面的计算已经足以说明,就算几个游戏加起来如果有一千个文件,这些数据加起来也就12MB,一万个也就120MB(不算$Bitmap),对于今天的主流配置来说这点内存占用完全可以忽略。而不管是删除游戏还是我们平时打开游戏来玩,就不需要从硬盘中读取这些数据了。
最后,关于NTFS分区上如何找到一个文件的$MFT记录号、上级文件夹的索引数据,有兴趣的朋友可以看看我前几天写的文章:
扫了一眼目前的回答,觉得都没说的很正确。
有几个答案有明显的错误:
1. 拿FAT做举例的,首先NTFS不是FAT,其次,你真算过要是拿FAT32/exFAT存储80G数据,删数据时需要做的清理工作有多大吗?
2. 有人提到固实数据或者NTFS预分配,需要提醒的是Windows Native API里是没有删非空目录的API的,文件系统也不允许,不相信的可以翻MSDN找。或者去看看WDK里的FAT源码,都是开源的,看看文件系统层面上到底支持不支持删目录下的全部文件。或者哪怕看看ReactOS里,也有NTFS的实现,这个可以跟Windows兼容的。
然后说说我的看法:
首先题主给的信息很少,只说了个80G,但没提供更多的信息:
1. 在什么条件下删除的?刚刚下载完?刚刚玩完?还是刚启动steam?这会影响缓存。
2. 这个游戏有多少个文件?文件数量是影响删除效率的关键。
3. 电脑的配置怎样?SSD还是NvME?内存多大?
影响文件系统删除性能的指标有:
1. 文件大小;
2. 文件数量;
3. 缓存;
4. 设备速度。
Steam删的快,要么就是上面的几个指标比较合理,要么就是后台删除,包括另外起一个线程、进程删除、移动到回收站等等。
删除的原理我不细说了,别的答案里有,就是删除索引加上回收数据块,并非真的把80G的数据清零。
那么用数字来说话,看看理论上删除80G到底需要波及多大的数据量:
1. 文件大小。
NTFS采用bitmap方式索引空闲块,删除文件可以不更新其它内容,但这个bitmap是必然要更新的,这个bitmap有多大呢,可以算出来,通常情况下SSD至少是4K块,80G/4K/8=2.5M,也就是说,如果单删一个80G的大文件,需要更新至少2.5M的数据,如果题主用的是SSD的话,确实可以秒删。更重要的一点是,正常使用的情况下,这80G在bitmap上大概率是连续的,所以不会有太多的不连续IO请求。同时,如果块大小比4K大的话,效率还会更高一些。16K块对应的bitmap只有几百KB,已经很小了。
这里提一句FAT了,有人拿FAT做举例,但是没想过FAT作为例子是否合适,如果是FAT32上,还是以4K大小作为分配单元,那么80G需要80G/4K*4=80M的FAT链表,说实话,一秒钟写80M,比起2.5M的NTFS Bitmap来说,多了不少,要一秒钟写完还是有点难度的(因为还有软件开销),况且这还仅仅只是FAT链上的信息,其它的还没算呢。
2. 文件个数。
对于NTFS来说,一个文件在$MFT上占几百个字节,具体数量要看文件的属性,最少好像是64字节左右,但实际上好像没见过有这么小的记录,通常应该是在512字节上下,这里,少算点,按256字节计算。
如果80G的游戏都是大文件,1000个文件就需要:256*1000,大概是256K的样子,不多。
但如果都是小文件,比如平均一个文件1M,那么就是80000个文件,至少需要20M的写入量,这数据量就很恐怖了。
我手上的一个Linux 3.16源码,1.25G左右,接近5万个文件,都是小文件,在SSD上删除,差不多要半分钟。
同时,还有一个更重要的问题,对于文件来说,它跟bitmap还是不一样的,文件在$MFT上不一定连续分布,连续写入20M数据和写入4K*5120次分散的数据,效率是完全不同的,跑过硬盘性能测试的都知道:4K性能通常都比持续读写性能要低的多。
所以,如果游戏是几百个文件,秒删很正常,如果几千上万,那么秒删的难度就很大了。
3. 缓存
缓存的概念比较复杂,前面已经计算出来了,更新bitmap可能是2M多,更新$MFT在几K到几十M之间,但要更新这些数据,首先要读取对应的数据到内存。
如果是刚开机,刚打开steam,那么这些数据大概率是没有完全被缓存的,也就是说,要删除这些数据,首先需要读取一定量的数据,这个数量可能很大。
而如果题主是删除一个刚下载完的游戏,那么这些数据大概率是被缓存在内存里,读取的动作就不需要了,会节约很多时间。
同时,在文件系统、设备驱动、存储设备上都有缓存,如果此时设备比较空闲,或者数据刚刚被访问过,那么前面算出的几M的数据几乎都会被缓存命中,那么性能上会好很多,甚至极端情况下,都不需要访问磁盘。
有一些答案里提到了Steam提前“知道”要删除哪些文件,这里所谓的知道,就是指的缓存,但缓存最多解决了读的问题,数据更新的写的部分是不可缺少的,提前“知道”最多节约一半的时间(多数情况下一半都不到),最耗时的写的动作的时间省不下来。
4. 设备速度
这个没什么可说的,NvME > SSD > HDD,细分一下,就是多考虑一下4K性能或者IOPS指标,对于NvME或者SSD来说,还有Trim/Discard的问题,理论上说,还可能更快。不同设备的IOPS不太一样,我没用过NvME,但贵的SSD和便宜的SSD差别就在IOPS指标上。
-----------------------
对于题主遇到的情况,如果是数量较少的大文件,那么秒删是很正常的,因为本身波及的数据量不大,如果是比较多的文件(几千个),并且还是在SSD甚至HDD上,那么可以认为Steam必然是用了后台删除的功能。
许多类似的游戏,总希望用种种的道德悖论让大家对统治者产生一种错觉:原来剥削我24小时工作都是迫不得已,原来让我的孩子去冒险工作是迫不得已,原来他派我们去送死是在下一盘大棋………
然而事实真的是这样吗?
感谢寒霜朋克,感谢11bit,让我们在这个游戏中明白了,其实没有什么大棋,
小人们被冻死,被饿死,被抛弃,绝望的呼喊,愤怒的抱怨,甚至怒而破坏、叛乱,
都只是因为你菜!
原来,我们本可以让我们的人民,有饭吃,不受冻,勇于探索,积极乐观,活的,像个人一样。
我们本可以做到,我们本就应该做到。
领导者们,本就应该做到。