计算文件夹大小:空文件夹是否具有默认大小?

时间:2013-07-11 21:04:56

标签: python windows

我正在尝试用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的Explorer所说的结果。

我创建了一个名为“temp”的文件夹,其中包含一个名为temp的子文件夹和一个名为ciao.txt的7字节文件。临时文件夹为空。 如果我执行我的函数,我获得我的主文件夹大小为7个字节。但是使用Windows资源管理器,我获得4096个字节。

我必须为所有子文件夹计算默认大小吗?

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

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

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

Edit2:我编辑了上一版本的代码。

2 个答案:

答案 0 :(得分:6)

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

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

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

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


那么,如果你想要磁盘上的实际大小呢?

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

作为一个快速黑客,你可以只舍入到最近的块大小。有一些不常见的情况,这会给你错误的答案(例如,如果你使用NTFS多流文件,你必须整理每个流的大小,而不是总数),但通常这是足够好的。

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

答案 1 :(得分:1)

资源管理器显示"尺寸"和"磁盘上的大小"。由于多个文件无法共享磁盘集群,因此文件在磁盘上占用的最小大小为一个集群(计算机上为4096字节)。看看"尺寸"在资源管理器中。

相关问题