Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Программирование —› Размер папки (казалось бы простой вопрос)
Посл.ответ Сообщение

Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 10 июля 2007 15:42
· Личное сообщение · #1

Всем привет...

Возник вот какой вопрос:
Как подсчитать физический размер папки на диске? Т.е. если у папки в Винде выбрать "Свойства", то будет подсчитан "Размер" и "На диске". С первым все ясно, сумма размеров всех файлов, а вот как подсчитать вторую величину??? В некоторых случаях она ОЧЕНЬ СИЛЬНО разнится с первой величиной.

Заранее спасибо...



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 10 июля 2007 15:47 · Поправил: Smon
· Личное сообщение · #2

NeoTall пишет:
В некоторых случаях она ОЧЕНЬ СИЛЬНО разнится с первой величиной.

Это связано с тем, что информация на диске располагается в кластерах, размер кластера влияет на размер файла на диске. К примеру если файл занимает 10 байт - он будет расположен в отдельном кластере (т.к. каждый файл начинается с нового кластера) и этот кластер будет помечен как занятый и в него ничего не будет дописываться, итого - размер - 10 байт, на диске - 4 кб в одном кластере, если к примеру возьмем 6 кб файл - то он будет занимать 4+2 кб в двух кластерах, итого на диске 8 кб (для 4 кб кластеров). Естественно то, что папка с большим кол-вом маленьких файлов зачастую занимает полуторократный размер на диске от своего реального. Чтобы узнать размер на диске нужно получить размеры кластера на диске и разделить размер каждого файла на размер кластера округляя до большего, затем умножаем полученное число на размер кластера и получаем размер папки\файла на диске.

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels




Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 10 июля 2007 16:00 · Поправил: NeoTall
· Личное сообщение · #3

Smon, причину-то разницы величин я знаю. Меня интересует как подсчитать. Хотя бы алгоритм по которому Винда считает, а если кто код подкинет, будет вообще сказка...

Smon пишет:
Соотвественно чтобы узнать размер на диске нужно получить размеры кластера на диске и разделить размер каждого файла на размер кластера округляя до большего.

Может быть, хотя думаю, это не так. А если файл большой и фрагментирован, то уже твое предложение не "катит", надо будет у каждого фрагмент подсчитывать и округлять до большего. Ведь Винда не производит типа "Defrag Analyze" для подсчета размера папки на диске...

И еще, а как же имена папок и файлов (в смысле, по идее чем они длиннее, тем больше занимают места), а папки ".." и ".", а если ФС не FATxx, а NTFS, какая будет разница в подсчетах???



Ранг: 49.7 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 10 июля 2007 16:07
· Личное сообщение · #4

NeoTall, именно так. Недописанным может быть только один кластер - последний. Все остальные заполнены полностью.
С NTFS всё интереснее - файлы размером меньше кластера могут храниться в MFT. Правда и в этом случае они будут занимать один кластер.
Папки "." и ".." представлены только как записи файлов в родительской папке, а на диске им дополнительное место не выделяется.



Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 10 июля 2007 16:16
· Личное сообщение · #5

ViSoR пишет:
Недописанным может быть только один кластер - последний. Все остальные заполнены полностью.

Уже сам понял... Т.е. для подсчета размера файла будет верен следующий код (для 4кБного кластера):
if (FileSize mod 4096) <> 0 then
FileSize := ((FileSize div 4096) + 1) * 4096;

Но остается вопрос по поводу зависимости размера на диске от длины имени файла/папки...



Ранг: 36.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 10 июля 2007 16:28
· Личное сообщение · #6

ViSoR, Smon. Ребят, сенкс... Все работает, у меня оказывается 32кБ кластер, вот и ошибся, все подсчитывается с точностью до байта...



Ранг: 12.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 июля 2007 01:21
· Личное сообщение · #7

NeoTall пишет:
Может быть, хотя думаю, это не так. А если файл большой и фрагментирован, то уже твое предложение не "катит", надо будет у каждого фрагмент подсчитывать и округлять до большего. Ведь Винда не производит типа "Defrag Analyze" для подсчета размера папки на диске...


Фрагмент (кроме последнего) всегда занимает целое количество (полных) кластеров, так что это не проблема...

файлы размером меньше кластера могут храниться в MFT. Правда и в этом случае они будут занимать один кластер.
нет, не будут, т.к. выделение в $MFT
Кроме этого не "меньше кластера", а меньше ~500байт, т.к. запись MFT ~1Кб.

Плюс не забываем о фиче ntfs: альтернативные потоки....



Ранг: 3.9 (гость)
Активность: 0=0
Статус: Участник

Создано: 16 июля 2007 16:34
· Личное сообщение · #8

Да, если присоединены дополнительные потоки, то их размер считается в графе "место на диске", а размер самого файла не увеличится. Вдруг у тебя вирь поселился квартирантом


 eXeL@B —› Программирование —› Размер папки (казалось бы простой вопрос)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати