2013-10-18 46 views
1

我把代码从一个本应衡量一个目录的大小对堆栈溢出问题:递归目录大小包括符号链接两次

def dirSize(directory): 
    totalSize = 0 
    for dirpath, dirnames, filenames in os.walk(directory): 
     for f in filenames: 
      fp = os.path.join(dirpath, f) 
      totalSize += os.path.getsize(fp) 
    return totalSize 

但是,如果我有这样的目录:

ls -l 
    -rw-r--r-- 1 lucas lucas 5120000 Oct 18 17:36 x 
    lrwxrwxrwx 1 lucas lucas  1 Oct 18 17:34 y -> x 

我跑它的功能,我得到这个:

10240000 

它似乎计数符号链接作为他们链接到文件的大小,不是4KB,因为它们实际上是。我怎样才能解决这个问题?

+1

[使用Python计算目录大小?](http://stackoverflow.com/questions/1392413/calculating-a-directory-size-using-python) – vish

+1

虽然接受的答案没有解决他的问题'stat'版本应该 –

+0

@vish这就是我在原始问题 –

回答

1

怎么样

totalSize += os.path.getsize(fp) if not os.path.islink(fp) else 4096 
1

只是传递参数followlinks=Falseos.walk。有关更多信息,请参阅documentation

+0

中提到的问题,这可能没有帮助,因为os.walk实际上并不在链接后面,因为os.path.getsize是+1,但它可能工作(不是在一个位置测试atm) –

+0

是不是'followlinks = False'默认,在任何情况下? – DSM

+0

没有改变任何东西 - 正如帝斯曼说的,我认为'followlinks'默认是关闭的。 –