Справжнє питання полягає в тому, для чого ви маєте намір використовувати розмір ?
Ваша перша проблема полягає в тому, що існує принаймні чотири визначення поняття "розмір файлу":
Зсув "кінця файлу" - це кількість байтів, яку потрібно пропустити, щоб перейти від початку до кінця файлу.
Іншими словами, це кількість байтів логічно у файлі (з точки зору використання).
"Дійсна довжина даних", яка дорівнює зміщенню першого байта, який насправді не зберігається .
Це завжди менше або дорівнює "кінці файлу" і кратно розміру кластера.
Наприклад, файл розміром 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 ім’я, а якщо вони довгі, то наявність кількох імен може використовувати більше місця на диску для метаданих . (Одна і та ж історія з кількома потоками тощо.)
Чи підраховуєте ви їх теж?