2013-07-11 4 views
0

Я пытаюсь вычислить размер папки в 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 и файл из 7 байт, называемый ciao.txt. Временная папка пуста. Если я выполняю свою функцию, я получаю, что моя основная папка имеет размер 7 байт. Но с проводником Windows я получаю 4096 байт.

Должен ли я вычислять размер по умолчанию для всех, также пустых, подпапок?

Функция getsize по умолчанию в модуле os возвращает 0 для всех каталогов.

Edit: Я проверил мой код на раздел NTFS файловой системы

Edit: Спасибо, теперь я понял. Что я хотел бы сделать, это лучшая команда dir/ls. Я использую прежнюю сумму, рассчитанную с использованием getize, теперь, когда я понял разницу, это хорошо для меня.

Редактировать 2: Я редактировал код, помещающий свою последнюю версию.

+0

Что такое файловая система? FAT32? NTFS? –

+0

бит «пустых папок» походит на красную селедку на ваш реальный вопрос. Да, пустые папки имеют размер по умолчанию - или, скорее, минимальный размер (если вы заполняете и затем выгружаете каталог, это может быть больше). Но это 0 в Windows. (В большинстве систем Unix он имеет порядок 32-128, если вы его запрашиваете, каталог должен иметь реальный список каталогов с элементами '.' И '..'. Хотя файловая система _could_ создавала эти ленивые, это не то, что HFS +, ext3 и т. д.). – abarnert

ответ

6

Существует два способа подсчета размера файла.

Вы можете подсчитать количество байтов, фактически используемых файлом.

В качестве альтернативы вы можете подсчитать количество байтов, зарезервированных для файла. Поскольку вам приходится использовать целые блоки за раз, если размер вашего диска составляет 4096 байт, даже самый маленький файл использует 4096 байт, которые не может использовать ни один другой файл (если вы не используете параметр сжатой файловой системы, который больше никто не использует).

Проводник Windows показывает последнее как «Размер на диске». Вы вычисляете первый с getsize.


Итак, что, если вы хотите, чтобы фактический размер на диске?

На современных платформах Unix и Unix os.stat будет содержать st_blocks, и Python покажет его вам. Вы можете умножить это на размер блока файловой системы, чтобы получить правильный ответ. Но Windows этого не имеет.

В качестве быстрого взлома можно округлить до ближайшего размера блока. Есть некоторые необычные случаи, когда это даст вам неправильный ответ (например, если вы используете файлы с несколькими потоками NTFS, вам придется округлить размер каждого потока, а не общий), но обычно это достаточно хорошо.

Наконец, вы можете пропустить os.stat и перейти прямо к GetFileInformationByHandleEx (через ctypes или win32api), или старые функции, которые он заменил, чтобы получить FILE_STANDARD_INFO.AllocationSize - это «размер на диске», а EndOfFile для обычных файлов - «размер».

1

Проводник показывает как «Размер», так и «Размер на диске». Поскольку несколько файлов не могут совместно использовать кластеры дисков, минимальный размер файла, который будет занимать на диске, - это один кластер (4096 байт на вашем компьютере). Посмотрите на «Размер» в Проводнике.

Смежные вопросы