173

Просто то, с чем я столкнулся и не мог придумать правильного объяснения. Если я создаю пустой файл * .txt на моем ПК, а затем смотрю на его размер, он показывает 0. Но как это возможно? Я имею в виду, что даже если сам файл пуст, он все равно должен иметь некоторый размер, чтобы хранить свое собственное имя. Как это можно объяснить? (Не зависит от ОС)

10 ответов10

202

Это возможно, потому что действительно нет файла. Там просто запись в каталоге с именем и владельцем. Запись каталога логически отличается от файла. Например, один и тот же файл может иметь более одного имени в нескольких каталогах.

К сожалению, термин "файл" не всегда означает одно и то же. Но логика размера файла исходит из модели, в которой запись каталога "присоединяет" файл к каталогу, а имена файлов и соответствующие метаданные хранятся в каталоге.

82

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

Есть много размеров файлов, которые имеют смысл. Наиболее распространенным, и тот, который вы видите здесь, является «количество байтов в файле». Если файл является пустым текстовым файлом, он может действительно содержать 0 байтов. Это число важно для программистов, потому что нам часто нужно открывать файл, «читать все данные» и закрывать его. Нам нужно знать, сколько байтов данных будет в файле, чтобы мы могли планировать заранее.

Другое значение вытекает из того, как большинство файловых систем хранят данные. Большинство файловых систем хранят данные в блоках. Например, файловая система может хранить данные в блоках по 64 КБ, что означает, что она никогда не выделит ничего, что не кратно 64 КБ. Это звучит неэффективно, но может сделать бухгалтерию намного проще, а часто проще, значит быстрее.

Третье значение, к которому вы обращаетесь, - это фактическое количество бит, необходимых на жестком диске для описания наличия файла. Это включает в себя информацию, которая обычно хранится отдельно от файла. Например, в Linux понятие "имя файла" хранится в inode для каталога, содержащего файл (edit: из комментариев, технически это хранится в данных каталога). Когда я писал это, я думал о случае с маленьким каталогом. Данные размером менее 156 байт могут храниться непосредственно в inode). Это не часто используемое значение, потому что его очень трудно определить, не зная чрезвычайно глубокую внутреннюю работу вашей файловой системы (учли ли вы место, необходимое для хранения всех разрешений в файле?). Однако, если у вас есть жесткий диск на 1 000 000 байт, и вы хотите знать, какой размер файла умещается на этом жестком диске, это будет для вас очень важным значением!

53

Имя файла хранится где-то еще.

На вашем диске будет "файловая система", проще говоря, выберите способ представления и интерпретации имен файлов и файлов на физическом диске.

На большинстве дисков Windows вы будете использовать файловую систему с именем "NTFS" (файловая система новой технологии), при этом информация об имени файла хранится в основной таблице файлов (MFT) отдельно от содержимого файла. См. Статью в Википедии на Master File Table.

Следовательно, сам файл будет иметь длину 0 байт, но его запись в MFT все равно будет занимать некоторое место.

12

Это довольно интересный онтологический вопрос ...

Сам файл является содержимым файла. Если файл не имеет содержимого, его размер равен нулю. Имя файла является такой же частью файла, как ваше собственное имя физически является частью вас (т. Е. Это не так).

Подобно тому, как ваше имя существует в голове (и вашей собственной) как идея, которая ссылается на / указывает на вашего физического лица, имя файла существует в дереве каталогов файловой системы и ссылается на / указывает на файл.

7

(С небольшим опозданием на ответ ...)

Как файл может иметь нулевой размер, немного сложнее, чем приведенные выше ответы. Вопрос помечен Win7, но рассмотрение других "более простых" файловых систем, таких как FAT или NTFS, может оказаться полезным, так как концепции похожи.

Диск не "знает", что такое файл и что такое каталог; это все данные в маленьких блоках. ОС различает значение блоков данных. Первые несколько особенные, но остальные блоки содержат либо информацию о данных (например: имя файла, длину файла, первый блок данных, содержащий данные), либо сами данные.

Каталог - это специальный "файл", чьи "данные", понимаемые ОС, являются информационным блоком, содержащим информацию о файлах, а не их содержимое. Хорошей аналогией является физическая библиотека и карточный каталог. Подумайте о информационных блоках как о карточном каталоге, а о полках - как о блоках данных (карточный каталог также расположен на полочной структуре).

Когда вы "создаете" файл (скажем, с помощью touch команды UNIX), ОС сначала создает запись в информационном блоке (каталоге) со следующим:

  • Name = My_File.txt
  • Длина = 0
  • Начальный блок данных = N/A
  • Дополнительная информация (владелец, права доступа, дата создания / обновления / изменения) и т.д.

Только если есть какие-то данные для "записи", он пытается найти пустой блок данных для хранения данных. Но блоки данных имеют фиксированный размер (скажем, 32 КБ), удобный для доступа к диску и чтения ОС. Если вы пишете только "Hello", большая часть блока является "пустой" (фактически это могут быть не нули, а мусор из того, что было раньше), поэтому таблица теперь также обновляет размер до длины (скажем, 5 символов + конец Файл), так что вы не получите плохие вещи.

Когда вы обновляете "файл" до длины> размера блока, ОС записывает данные в новый блок и обновляет блок данных, чтобы сказать, что файл продолжается в следующем блоке ПОСЛЕ первого (и так далее), а длина обновляется. новая длина (детали различаются).

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

Логически это также объясняет, почему перемещение файла в одной и той же файловой системе быстро мигает, а копирование занимает много времени. Операционная система должна только отредактировать 2 блока каталога, чтобы удалить запись из одного каталога (информационный блок данных) и добавить в другой. Удалить файл: просто удалите запись в блоке каталога, освобождая блоки данных файла для перераспределения.

PS: То, что в карточном каталоге есть запись для книги, не означает, что она находится на полке (возможно, проверена или утеряна); размер файла 0.

pps: неправильно размещенная книга в библиотеке подразумевает библиотеку поиска или в терминах компьютера: chkdsk или repair disk!

Большее понимание можно почерпнуть, прочитав иноды UNIX или оценив, как системы контроля версий (ClearCase, TFS, Git и т.д.) Управляют не только файлами и каталогами, но также версиями файлов и даже версиями каталогов. В большинстве случаев все хранится в базе данных и представляется пользователю в виде классической структуры каталогов и файлов!

4

У нас есть несколько отличных ответов - я бы просто добавил версию с картинкой (тысяча слов и все такое).

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

Этот маленький фиолетовый квадрат описывает список файлов, присутствующих на моем HD. Грубо говоря, для диска NTFS это содержание книги; вместо страниц он указывает на их физическое местоположение на остальной части диска 1.

Файл с нулевым байтовым размером может быть визуализирован как запись Оглавления, которая указывает на отсутствие страницы вообще:

Запись есть в списке, но так как страница не указана, мы можем предположить, что ее содержимое не существует.

1 - Конечно, это немного сложнее, чем это; но такие вопросы, как карты секторов, зеркальные MFT и т. д., выходят за рамки этих вопросов

3

Файловые системы хранят много информации о файле, такую как имя файла, размер файла, время создания, время доступа, время изменения, созданный пользователь, права пользователя и группы, фрагменты, указатель на кластеры, в которых хранится файл, жесткие / программные ссылки, атрибуты ... Они называются файловыми метаданными. Почему вы учитываете эти метаданные в размере файла, когда пользователи не заботятся о них и не знают о них? Они действительно заботятся только о содержимом файла

Кроме того, каждая файловая система хранит различные типы метаданных, которые занимают различное количество места на диске. Например разрешение POSIX очень отличается от разрешения NTFS, а также есть inode номер в POSIX , которые не существуют в Windows. Даже файловые системы POSIX сильно различаются, например ext3 с 32-битным адресом блока, ext4 с 48-битным, Btrfs с 64-битным и ZFS с 128-битным адресом. Так как вы будете считать эти метаданные в размер файла?

Возьмем другой пример со 100-байтовым файлом, метаданные которого занимают 56 байтов в текущей файловой системе. Мы копируем файл в другую файловую систему, и теперь он занимает 128 байтов метаданных. Однако содержимое файла точно такое же, количество байтов в файлах также одинаково. Поэтому отображение размера файла в системе как 156 байт, а в другом - 228 байт, очень запутанно и нелогично.

1

Размер файла 0 похож на высказывание: у меня есть бумага с 5 словами. А на другом листе написано 0 слов. Так что 0 вполне возможно.

Метаданные файла (время создания, дата последнего изменения, владелец файла, разрешения) хранятся в другом месте и не включаются в размер файла.

0

Так вот как это работает:

Как только вы создаете какой-либо файл на томе, он создает файловую запись в NTFS-файле mata, т.е. $ MFT(таблица основных файлов). Поскольку в MFT присутствует FRS(сегмент записи файла), вы увидите запись. Каждая файловая запись имеет размер 1 КБ по умолчанию в случае файловой системы NTFS. Но это пространство востребовано, только если вы храните некоторую информацию внутри файла. Даже если вы просто напишите одну букву "а", учитывая, что это текстовый файл, он будет занимать 1 КБ места, поскольку это размер FRS по умолчанию. Буква "а" идет к потоку данных по умолчанию и без имени этого FRS, $ Data, который является атрибутом, куда отправляются все ваши данные, если у вас нет ADS(альтернативного потока данных).

Дайте мне знать, если у вас возникнут какие-либо вопросы.

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .