Как размер файла на диске может быть 0 байт, если в нем есть данные?

106

У меня есть файл в Windows 10 с 362 байтами данных, но «размер на диске» составляет всего 0 байтов. Это простая программа "Hello world", написанная на ассемблере и сохраненная в Notepad ++ .

Как это возможно, что размер на диске равен нулю, если размер файла составляет 362 байта?

У меня есть SSD, а не обычный жесткий диск.

Снимок экрана диалогового окна "Свойства":

Снимок экрана диалога свойств

Coder88
источник
4
Краткий ответ: Если для хранения его содержимого не требуется дополнительного места на диске.
Дэвид Шварц
11
@ Томас Не дубликат. Название звучит похоже, но этот вопрос спрашивает, почему Windows объявляет файл нулевого байта равным нулю, несмотря на то, что где-то требуется регистрация. Этот вопрос спрашивает, почему размер на диске может быть нулевым, даже если в файле есть данные.
Бен Н
@BenN Помечает это неуместно, потому что вы правы, это, конечно, не дубликат.
Уильям
Привет, Coder88, я думаю, что человек, отметивший твой пост как дубликат, ошибся - другой вопрос задавал что-то другое; Вы действительно задали хороший вопрос. Если вы хотели указать, что ваш вопрос решен, вы можете нажать на галочку рядом с ответом здесь.
Бен Н

Ответы:

155

Это происходит, если файл настолько мал, что его содержимое и бухгалтерия файловой системы умещаются в 1 КБ. Чтобы сэкономить место на диске, NTFS хранит небольшие файлы «резидентными», сохраняя их содержимое прямо в записи файла, поэтому для него не нужно выделять кластер. Следовательно, размер на диске равен нулю, потому что нет ничего, кроме записи файла. Как только файл становится достаточно большим, NTFS делает его «нерезидентным», выделяет для него один или несколько кластеров (создавая ненулевой «размер на диске») и создает «сопоставительную пару» в записи файла вместо данных для указать на кластер.

SSD жесткие диски или Windows 10 не влияют на это; это просто функция NTFS. Дальнейшее чтение: Четыре стадии роста файлов NTFS .

Обратите внимание, что показатель «размер на диске» не совсем правильный. Например, он никогда не включает в себя постоянную 1 КБ, которую занимает запись файла NTFS. Метрика была введена в Windows 95, которая не использовала NTFS и поэтому не могла объяснить это явление; он просто показал размер файла, округленный до следующего кратного размера кластера. Этот алгоритм оценки был перенесен в Windows 7, хотя многие версии Windows между ними использовали NTFS и резидентное хранилище. Наконец, оно было обновлено в Windows 8 для подсчета файлов с резидентными данными как нулевого размера на диске. Дополнительная информация: « Что такое размер на диске»?

Бен Н
источник
1
Некоторое время я думал, что мы смотрим на эффекты дедупликации данных ( blog.fosketts.net/2012/01/03/… ), но я считаю, что эта функция работает на уровне, прозрачном для чего-то вроде метрики «размер на диске».
misha256
8
Но подождите ... Я не могу воспроизвести поведение OPs на томе NTFS (Windows 7). Независимо от того, как я создаю крошечные файлы (некоторые размером всего в один байт), каждый из них занимает 4 КБ «дискового пространства» в соответствии с диалоговым окном «Свойства файла». Хм ...
misha256
8
@ misha256 Да, я могу воспроизвести его с файлом размером ~ 700 байт в Windows 8.1. Я предполагаю, что алгоритм стал умнее где-то между Windows 7 и 8.1, так как изначально он не знал ни о каких причудливых вещах NTFS ( источник ). Обратите внимание, что как только файл переходит на второй этап, он никогда не сжимается обратно.
Бен Н
6
@ Филипп, я думаю, можно спорить в любом случае. Традиционно, «файл на диске» был «размером выделенных кластеров» (так, например, вы могли видеть эффекты выбора слишком большого размера кластера). Насколько мне известно, он никогда не включал пространство «каталога», необходимое файловой системе (например, размер «записи каталога» или «длина цепочки записей FAT»).
TripeHound
3
@Philipp: В любом случае, учет бухгалтерии по размеру файла быстро растет: как бы вы описали файл с 1 кластером с 3 именами?
Дедупликатор