Реальный вопрос в том, что вы собираетесь использовать для размера ?
Ваша первая проблема в том, что существует как минимум четыре определения для "размера файла":
Смещение «конец файла», которое представляет собой число байтов, которое необходимо пропустить, чтобы перейти от начала к концу файла.
Другими словами, это число байтов логически в файле (с точки зрения использования).
«Действительная длина данных», равная смещению первого байта , который фактически не сохраняется .
Это всегда меньше или равно «концу файла» и кратно размеру кластера.
Например, файл размером 1 ГБ может иметь допустимую длину данных 1 МБ. Если вы попросите Windows прочитать первые 8 МБ, она прочитает первые 1 МБ и сделает вид, что оставшиеся данные были там, возвращая их в виде нулей.
«Выделенный размер» файла. Это всегда больше или равно «концу файла».
Это количество кластеров, выделенных ОС для файла, умноженное на размер кластера.
В отличие от случая, когда «конец файла» больше, чем «допустимая длина данных», избыточные байты не считаются частью данных файла, поэтому ОС не заполнить буфер нулями, если вы попытаетесь прочитать в выделенной области за концом файла.
«Сжатый размер» файла, который действителен только для сжатых (и разреженных?) Файлов.
Он равен размеру кластера, умноженному на количество кластеров на томе, которые фактически выделены для этого файла.
Для несжатых и не разреженных файлов не существует понятия «сжатый размер»; вместо этого вы бы использовали «выделенный размер».
Ваша вторая проблема заключается в том, что "файл", такой как C:\Foo
, может иметь несколько потоков данных.
Это имя относится только к потоку по умолчанию . Файл может иметь альтернативных потоков, например C:\Foo:Bar
, размер которых даже не отображается в Проводнике!
Ваша третья проблема в том, что "файл" может иметь несколько имен ("жесткие ссылки").
Например, C:\Windows\notepad.exe
и C:\Windows\System32\notepad.exe
- это два имени для одного и того же файла. Любое имя может использоваться для открытия любого потока файла.
Ваша четвертая проблема заключается в том, что "файл" (или каталог) на самом деле может даже не быть файлом (или каталогом):
Это может быть мягкая ссылка («символическая ссылка» или «точка повторной обработки») на другой файл (или каталог).
Этот другой файл может даже не находиться на том же диске. Это может даже указывать на что-то в сети, или это может быть даже рекурсивно! Должен ли размер быть бесконечностью, если он рекурсивный?
Ваш пятый состоит в том, что существуют драйверы "фильтра", которые делают определенные файлы или каталоги похожими на настоящие файлы или каталоги, даже если это не так. Например, файлы изображений WIM от Microsoft (которые сжимаются) можно «смонтировать» в папке с помощью инструмента ImageX, и эти не выглядят как точки повторного анализа или ссылки. Они выглядят так же, как каталоги - за исключением того, что вы на самом деле не каталоги, и понятие «размер» для них не имеет смысла.
Ваша шестая проблема в том, что для каждого файла требуются метаданные.
Например, наличие 10 имен для одного и того же файла требует больше метаданных, что требует места. Если имена файлов короткие, 10 имен могут быть такими же дешевыми, как и 1 имя, а если они длинные, то наличие нескольких имен может использовать больше дискового пространства для метаданных . (Та же история с несколькими потоками и т. Д.)
Вы тоже это считаете?