ENOENT might show up if we're actively deleting files in the nilmdb thread while trying to read available space from e.g. the server thread.
34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
import os
|
|
import errno
|
|
from math import log
|
|
|
|
def human_size(num):
|
|
"""Human friendly file size"""
|
|
unit_list = zip(['bytes', 'kiB', 'MiB', 'GiB', 'TiB'], [0, 0, 1, 2, 2])
|
|
if num > 1:
|
|
exponent = min(int(log(num, 1024)), len(unit_list) - 1)
|
|
quotient = float(num) / 1024**exponent
|
|
unit, num_decimals = unit_list[exponent]
|
|
format_string = '{:.%sf} {}' % (num_decimals)
|
|
return format_string.format(quotient, unit)
|
|
if num == 0: # pragma: no cover
|
|
return '0 bytes'
|
|
if num == 1: # pragma: no cover
|
|
return '1 byte'
|
|
|
|
def du(path):
|
|
"""Like du -sb, returns total size of path in bytes. Ignore
|
|
errors that might occur if we encounter broken symlinks or
|
|
files in the process of being removed."""
|
|
try:
|
|
size = os.path.getsize(path)
|
|
if os.path.isdir(path):
|
|
for thisfile in os.listdir(path):
|
|
filepath = os.path.join(path, thisfile)
|
|
size += du(filepath)
|
|
return size
|
|
except OSError as e: # pragma: no cover
|
|
if e.errno != errno.ENOENT:
|
|
raise
|
|
return 0
|