1

我正在尝试在 Python 中计算文件夹的大小,但结果很奇怪。

这是我的代码片段:

def bestsize(filepath):
    """ Return a tuple with 3 values. The first is the file (or folder size). The second and third
    have sense only for folder and are the number of files and subdirectories in folder
    """
    from os.path import getsize, isdir
    if not(isdir(filepath)): return (getsize(filepath), 1, 0)
    else:
        lf = []
        ld = []
        for root, dirs, files in os.walk(filepath):
            for name in files: lf.append(os.path.join(root, name))
            for dir in dirs: ld.append(os.path.join(root, dir))
        return (sum(getsize(i) for i in lf), len(lf), len(ld))

我已经对它进行了一些测试,比较了 Windows 资源管理器所说的结果。

我创建了一个名为“temp”的文件夹,其中有一个名为 temp 的子文件夹和一个名为 7 字节的文件ciao.txt. 临时文件夹为空。如果我执行我的函数,我会发现我的主文件夹大小为 7 个字节。但是使用 Windows Explorer 我获得了 4096 个字节。

我必须为所有子文件夹(也是空的子文件夹)计算默认大小吗?

os 模块中的默认函数getsize为所有目录返回 0。

编辑:我已经在 NTFS 文件系统分区上测试了我的代码

编辑:谢谢,现在我明白了。我想做的是更好的 dir/ls 命令。我使用使用 getsize 计算的前一个总和,现在我已经理解了它对我来说很好的区别。

Edit2:我已经编辑了放置我最后一个版本的代码。

4

2 回答 2

7

有两种不同的方法来计算文件的大小。

您可以计算文件实际使用的字节数。

或者,您可以计算为文件保留的字节数。由于您必须一次使用整个块,如果您的磁盘块大小为 4096 字节,那么即使是最小的文件也会占用 4096 字节,这是其他文件无法使用的(除非您使用的是没人再使用的压缩文件系统选项)。

Windows 资源管理器将后者显示为“磁盘大小”。你用 计算前者getsize


那么,如果您想要磁盘上的实际大小怎么办?

在最新的 Unix 和类 Unix 平台上,os.stat将包含一个st_blocks,Python 会向您展示。您可以将其乘以文件系统的块大小以获得正确答案。但 Windows 没有。

作为一种快速破解,您可以四舍五入到最接近的块大小。在一些不常见的情况下,这会给您错误的答案(例如,如果您使用 NTFS 多流文件,则必须四舍五入每个流的大小,而不是总数),但通常这已经足够了。

最后,您可以跳过os.stat并直接转到GetFileInformationByHandleEx(通过ctypeswin32api)或它替换的旧功能,以获取FILE_STANDARD_INFO. 是“AllocationSize磁盘大小” EndOfFile,对于普通文件,是“大小”。

于 2013-07-11T21:21:18.393 回答
1

资源管理器同时显示“大小”和“磁盘大小”。由于多个文件不能共享磁盘集群,一个文件在磁盘上占用的最小大小是一个集群(在您的机器上为 4096 字节)。查看资源管理器中的“大小”。

于 2013-07-11T21:20:26.903 回答