Как узнать "размер файла на диске" ?
От: vgrigor  
Дата: 11.08.04 14:33
Оценка:
Как узнать "размер файла на диске" ?

т.е.не логический размер — 2 байта,
а сколько он вклюяая полный сектор займет ?

Есть такое апи ?

Спасибо
Винтовку добудешь в бою!
Re: Как узнать "размер файла на диске" ?
От: aGrey Литва  
Дата: 11.08.04 17:06
Оценка:
Здравствуйте, vgrigor

1. File Size vs "size on disk"

2. Determining Cluster Size

Или посмотри в сырцах-за-которые-обещали-надавать-по-шее-но-всем-пофиг CMountPoint::GetClusterSize() (файл MTPT)
Re[2]: Как узнать "размер файла на диске" ?
От: vgrigor  
Дата: 12.08.04 07:21
Оценка:
Я видел ::GetDiskFreeSpace() ...Ex()
которая возвращает кажется корректное значение сейчас,
размера кластетра,
свободное пространство,...

почему они не подходят для своего вычисления
(я думал апи есть)

G>Или посмотри в сырцах-за-которые-обещали-надавать-по-шее-но-всем-пофиг CMountPoint::GetClusterSize() (файл MTPT)


А что это за сырцы ?

И почему по шее ?
Сообщите что за страшные и интересные истории, с разведчиками и фашистами были про это?
Винтовку добудешь в бою!
Re: Как узнать "размер файла на диске" ?
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 12.08.04 07:28
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Как узнать "размер файла на диске" ?


V>т.е.не логический размер — 2 байта,

V>а сколько он вклюяая полный сектор займет ?

V>Есть такое апи ?



Щас мыслю скажу, а остальные коллеги подтвердят или опровергнут. Значит так: получаете размер кластера при помощи GetDiskFreeSpace. Получаете размер файла при помощи GetFileSize. Смотрите, во сколько кластеров влезает файл (арифметика). Причем если, например, размер кластера 2 байта и размер файла 3 байта, то он занимает на диске 2 кластера, т.е. 4 байта.

Мысль донес? Только сейчас проверил — файл размером 1 байт занимает на диске 8 Кб — целый кластер, зараза.
Re[2]: Как узнать" размер файла на диске" ?
От: Pavel Dvorkin Россия  
Дата: 12.08.04 07:32
Оценка:
Привет!

Flamer wrote:
> Щас мыслю скажу, а остальные коллеги подтвердят или опровергнут. Значит так: получаете размер кластера при помощи GetDiskFreeSpace. Получаете размер файла при помощи GetFileSize. Смотрите, во сколько кластеров влезает файл (арифметика). Причем если, например, размер кластера 2 байта и размер файла 3 байта, то он занимает на диске 2 кластера, т.е. 4 байта.

Попробую внести поправку. Это все верно, если файл не сжат. Если же он
сжат, то на диске он занимает , может быть, намного меньше.

The GetCompressedFileSize function retrieves the actual number of bytes
of disk storage used to store a specified file.

Так что вместо GetFileSize надо использовать GetCompressedFileSize.

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[2]: Как узнать "размер файла на диске" ?
От: vgrigor  
Дата: 12.08.04 07:36
Оценка:
Гранудрование определеяется по

BytesPerSector ?

т.е. округляется до большего целого и все ?
(на любой ОС ?)
Винтовку добудешь в бою!
Re[3]: Как узнать" размер файла на диске" ?
От: Pavel Dvorkin Россия  
Дата: 12.08.04 07:40
Оценка:
Привет!

vgrigor wrote:
>
> Гранудрование определеяется по
>
> BytesPerSector ?
>
> т.е. округляется до большего целого и все ?
> (на любой ОС ?)

Да. Но это практически всегда 512.

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re: Как узнать "размер файла на диске" ?
От: Othello  
Дата: 12.08.04 08:50
Оценка: :)
V>Как узнать "размер файла на диске" ?

V>т.е.не логический размер — 2 байта,

V>а сколько он вклюяая полный сектор займет ?

V>Есть такое апи ?


V>Спасибо


делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace
b-a -> столько и занимал файл!
... << RSDN@Home 1.1.4 >>
Re[2]: Как узнать "размер файла на диске" ?
От: Othello  
Дата: 12.08.04 08:51
Оценка:
Здравствуйте, Othello, Вы писали:

V>>Как узнать "размер файла на диске" ?


V>>т.е.не логический размер — 2 байта,

V>>а сколько он вклюяая полный сектор займет ?

V>>Есть такое апи ?


V>>Спасибо


O>делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace

O>b-a -> столько и занимал файл!
упс... тупимс... a-b на самом деле
... << RSDN@Home 1.1.4 >>
Re: Как узнать "размер файла на диске" ?
От: brokensword Украина http://www.diprotector.com
Дата: 12.08.04 09:11
Оценка:
при чем тут сектор?
файл займет место кратное кол-ву байт в кластере (для FAT32 — это 32 Кб). А узнать текущую FAT можно легко
*********************************************
www.k-medulla.com
Best software protection system on the market

www.diprotector.com
First software protection system for PDA developers
Re: Как узнать "размер файла на диске" ?
От: Аноним  
Дата: 12.08.04 10:45
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Как узнать "размер файла на диске" ?


V>т.е.не логический размер — 2 байта,

V>а сколько он вклюяая полный сектор займет ?


if ( IsNtfs() )
{
  // можно поюзать FSCTL_QUERY_ALLOCATED_RANGES
  if ( IsCompressed() ) // use FSCTL_GET_COMPRESSION
     .... // не помню
  else if ( FileSizeInBytes > 300 ) // примерно
  {
    SizeOnDisk = ((FileSizeInBytes + BytesPerCluster - 1)/BytesPerCluster)*BytesPerCluster;
  }
}
else
{
    SizeOnDisk = ((FileSizeInBytes + BytesPerCluster - 1)/BytesPerCluster)*BytesPerCluster;
}
Re[3]: Как узнать "размер файла на диске" ?
От: Stanky  
Дата: 12.08.04 11:27
Оценка:
> упс... тупимс... a-b на самом деле
>
Точно: правильно b-a!!!
Способ просто КЛАСС!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[2]: Как узнать "размер файла на диске" ?
От: Stanky  
Дата: 12.08.04 11:27
Оценка:
> файл займет место кратное кол-ву байт в кластере (для FAT32 — это 32 Кб).
>
Поправочка: размер кластера в FAT'е зависит от размера раздела!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[2]: Как узнать "размер файла на диске" ?
От: vgrigor  
Дата: 12.08.04 11:30
Оценка: -2
F>Мысль донес? Только сейчас проверил — файл размером 1 байт занимает на диске 8 Кб — целый кластер, зараза.

А вот и нет...

Все не так просто, и без компрессии:

Файл может быть фрагментирован,
и считать надо округляя не файл,а каждый фрагмент,
т.е. столько сколько у файла фрагментов.

А как это узнать ?

Не слышали такого?
Винтовку добудешь в бою!
Re[3]: Как узнать "размер файла на диске" ?
От: Guard_h4s Россия  
Дата: 12.08.04 11:35
Оценка:
Здравствуйте, Stanky, Вы писали:

>> файл займет место кратное кол-ву байт в кластере (для FAT32 — это 32 Кб).

>>
S>Поправочка: размер кластера в FAT'е зависит от размера раздела!!!

Хорошо: тогда создайте в FAT32 раздел на 40 Гб с размером кластера 4Кб.
Re[3]: Как узнать "размер файла на диске" ?
От: Alex Reyst Россия  
Дата: 12.08.04 11:37
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Файл может быть фрагментирован,

V>и считать надо округляя не файл,а каждый фрагмент,
V>т.е. столько сколько у файла фрагментов.


И где это такая интересная фрагментация, что все фрагменты файла меньше размера кластера?
Все, что здесь сказано, может и будет использоваться против меня...
Re[3]: Как узнать "размер файла на диске" ?
От: vgrigor  
Дата: 12.08.04 11:47
Оценка:
Ошибся.
Такого не бывает.

Все кластеры — целые.

Просто 4 килобайта = кластеров* сектор занимает каждый неконченный квант.
Винтовку добудешь в бою!
Re[3]: Как узнать "размер файла на диске" ?
От: Stanky  
Дата: 12.08.04 12:03
Оценка: +1
> Файл может быть фрагментирован,
> и считать надо округляя не файл,а каждый фрагмент,
> т.е. столько сколько у файла фрагментов.
>
Какая чушь!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[4]: Как узнать "размер файла на диске" ?
От: Stanky  
Дата: 12.08.04 12:03
Оценка:
> Хорошо: тогда создайте в FAT32 раздел на 40 Гб с размером кластера 4Кб.
>
Проблема не понятна!!!
Максимальный размер раздела при таком размере кластера где-то 25ГБ!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[2]: Как узнать "размер файла на диске" ?
От: Аноним  
Дата: 12.08.04 12:04
Оценка:
Здравствуйте, Othello, Вы писали:

V>>Как узнать "размер файла на диске" ?


V>>т.е.не логический размер — 2 байта,

V>>а сколько он вклюяая полный сектор займет ?

O>делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace

O>b-a -> столько и занимал файл!

Такой трюк не пройдет для маленьких файлов на NTFS, поскольку они целиком располагаются в MFT, то удаление этого файла не изменит FreeSpace.
Re[5]: Как узнать "размер файла на диске" ?
От: Guard_h4s Россия  
Дата: 12.08.04 12:14
Оценка:
Здравствуйте, Stanky, Вы писали:

S>Проблема не понятна!!!


Извиняюсь, кажется я действительно не так понял предыдущий пост
Re[4]: Как узнать "размер файла на диске" ?
От: vgrigor  
Дата: 12.08.04 13:58
Оценка:
S>Какая чушь!!!

Бывает заработаешься,
и не такое в голову придет.

Sorry за оффтоп.
Винтовку добудешь в бою!
Re[3]: Как узнать "размер файла на диске" ?
От: aGrey Литва  
Дата: 12.08.04 17:11
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>А что это за сырцы ?

V>И почему по шее ?
V>Сообщите что за страшные и интересные истории, с разведчиками и фашистами были про это?

С хакерами и юристами Microsoft...
Re[2]: Как узнать "размер файла на диске" ?
От: Valerio Россия linkedin.com/in/boronin
Дата: 17.08.04 05:37
Оценка:
O>делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace
O>b-a -> столько и занимал файл!
где гарантии что в это время paging file не подрос, tmp file не умер или кто-то другой что-то свое не записал\стер?
... << RSDN@Home 1.1.4 @@subversion >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[4]: Как узнать" размер файла на диске" ?
От: Valerio Россия linkedin.com/in/boronin
Дата: 17.08.04 05:37
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:
>> т.е. округляется до большего целого и все ?
>> (на любой ОС ?)

PD>Да. Но это практически всегда 512.

ага, в настоящее время это всегда на x86, без практически
... << RSDN@Home 1.1.4 @@subversion >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: Как узнать "размер файла на диске" ?
От: Othello  
Дата: 17.08.04 06:17
Оценка:
O>>делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace
O>>b-a -> столько и занимал файл!
V>где гарантии что в это время paging file не подрос, tmp file не умер или кто-то другой что-то свое не записал\стер?
ЭЭЭЭ.... НЕТУ!
ИМХО:
Только если это делать как одной — неделимой операцией...
... << RSDN@Home 1.1.4 >>
Re[5]: Как узнать" размер файла на диске" ?
От: MShura  
Дата: 17.08.04 09:42
Оценка:
Здравствуйте, Valerio, Вы писали:

V>Здравствуйте, Pavel Dvorkin, Вы писали:

>>> т.е. округляется до большего целого и все ?
>>> (на любой ОС ?)

PD>>Да. Но это практически всегда 512.

V>ага, в настоящее время это всегда на x86, без практически

На SCSI и MO очень(!) часто BytesPerSector > 512
Re[6]: Как узнать" размер файла на диске" ?
От: Valerio Россия linkedin.com/in/boronin
Дата: 18.08.04 04:29
Оценка:
Здравствуйте, MShura, Вы писали:

PD>>>Да. Но это практически всегда 512.

V>>ага, в настоящее время это всегда на x86, без практически

MS>На SCSI и MO очень(!) часто BytesPerSector > 512

да, конечно же я имел ввиду жесткие диски
понятно что всякие CD девайсы всегда опять же имеют 2048 байта.

насчет SCSI жестких дисков:
любопытно, есть ли тут серийные устройства (HDD) с размером не 512 на сектор?
... << RSDN@Home 1.1.4 @@subversion >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: Как узнать "размер файла на диске" ?
От: mokc0der  
Дата: 18.08.04 05:51
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Гранудрование определеяется по


V>BytesPerSector ?


V>т.е. округляется до большего целого и все ?

V>(на любой ОС ?)

Файлы выравниваются не по BytesPerSector а по BytesPerClaster. А скока байт в кластере зависит от файловой системы и тем какой размер кластера выбран при ее создании. 512 только для FAT12. Так от 4096 до 65536
Re[5]: Как узнать "размер файла на диске" ?
От: perezzz Беларусь  
Дата: 18.08.04 14:35
Оценка:
>> Хорошо: тогда создайте в FAT32 раздел на 40 Гб с размером кластера 4Кб.
>>
S>Проблема не понятна!!!
S>Максимальный размер раздела при таком размере кластера где-то 25ГБ!!!
Теоретически на FAT32 можно создать раздел, равный 512 * 2^32 байт = 2Тб, т.к в 0-м секторе раздела по смещению 0x20 хранится 4 байтовое количество секторов в разделе. При этом таблица FAT будет содержать в себе 2^32 элементов, т.е это максимальное количество кластеров в разделе, при условии что размер кластера равен размеру сектора. Максимальный размер кластера равен 64 секторам, т.е 512 * 64 = 32Кб. Следует учитывать, что размер раздела должен быть кратен размеру кластера.
... << RSDN@Home 1.1.4 beta 2 r157>> :: Vader — The Code
Re: Как узнать "размер файла на диске" ?
От: mig23  
Дата: 18.08.04 19:10
Оценка:
Здравствуйте, vgrigor, Вы писали:

V>Как узнать "размер файла на диске" ?


V>т.е.не логический размер — 2 байта,

V>а сколько он вклюяая полный сектор займет ?

V>Есть такое апи ?


V>Спасибо


Вопрос, как мне кажется, несложный — то есть как раз для моего уровня развития
Мне кажется, нужно взять размер файла,(вышеупомянутые 2 байта) и округлить вверх до ближайшего числа, равного размеру кластера для данного драйва. Если не ошибаюсь, то API GetDiskFreeSpace и GetDiskFreeSpaceEX возвращают в одном из параметров размер кластера.
Успехов!
Re[6]: Как узнать "размер файла на диске" ?
От: MShura  
Дата: 19.08.04 12:10
Оценка:
Здравствуйте, perezzz, Вы писали:

>>> Хорошо: тогда создайте в FAT32 раздел на 40 Гб с размером кластера 4Кб.

>>>
S>>Проблема не понятна!!!
S>>Максимальный размер раздела при таком размере кластера где-то 25ГБ!!!
P>Теоретически на FAT32 можно создать раздел, равный 512 * 2^32 байт = 2Тб, т.к в 0-м секторе раздела по смещению 0x20 хранится 4 байтовое количество секторов в разделе. При этом таблица FAT будет содержать в себе 2^32 элементов, т.е это максимальное количество кластеров в разделе, при условии что размер кластера равен размеру сектора. Максимальный размер кластера равен 64 секторам, т.е 512 * 64 = 32Кб. Следует учитывать, что размер раздела должен быть кратен размеру кластера.

Вы неправы. На FAT32 максимальное кол-во адресуемых кластеров 2^28. Это написано в спецификации Microsoft на FAT32.
Максимальный размер кластера 64 сектора (иногда можно 128, но это может не работать в некоторых Windows).
Если считать, что BytesPerSector = 512, то максимальный размер адресуемого пространства получается примерно 2^28*128*512 = 2^28*2^7*2^9 = 2^44. Чтобы получить размер тома, на котором FAT32 может юзать столько места необходимо прибавить два размера таблицы FAT.
Re[7]: Как узнать" размер файла на диске" ?
От: MShura  
Дата: 19.08.04 12:13
Оценка: 5 (1)
Здравствуйте, Valerio, Вы писали:

V>Здравствуйте, MShura, Вы писали:


PD>>>>Да. Но это практически всегда 512.

V>>>ага, в настоящее время это всегда на x86, без практически

MS>>На SCSI и MO очень(!) часто BytesPerSector > 512

V>да, конечно же я имел ввиду жесткие диски
V>понятно что всякие CD девайсы всегда опять же имеют 2048 байта.

V>насчет SCSI жестких дисков:

V>любопытно, есть ли тут серийные устройства (HDD) с размером не 512 на сектор?

Такие устройства есть, поскольку пользователи наших коммерческих программ, у которых жесткие диски имеют сектор не 512 обычно имеют проблемы. Они пишут нам.
Пока это были только SCSI.
Re[7]: Как узнать "размер файла на диске" ?
От: Stanky  
Дата: 22.08.04 12:55
Оценка:
> Вы неправы. На FAT32 максимальное кол-во адресуемых кластеров 2^28. Это
> написано в спецификации Microsoft на FAT32.
>
Спецификацию я конечно не читал, но мои опыты в своё время показали, что максимальное количество кластеров 2^24!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[8]: Как узнать "размер файла на диске" ?
От: MShura  
Дата: 23.08.04 11:01
Оценка:
Здравствуйте, Stanky, Вы писали:

>> Вы неправы. На FAT32 максимальное кол-во адресуемых кластеров 2^28. Это

>> написано в спецификации Microsoft на FAT32.
>>
S>Спецификацию я конечно не читал, но мои опыты в своё время показали, что максимальное количество кластеров 2^24!!!

http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/fatgen103.doc

Цитата:
Note how the FAT32 code above works. A FAT32 FAT entry is actually only a 28-bit entry. The high 4 bits of a FAT32 FAT entry are reserved. The only time that the high 4 bits of FAT32 FAT entries should ever be changed is when the volume is formatted, at which time the whole 32-bit FAT entry should be zeroed, including the high 4 bits.

A bit more explanation is in order here, because this point about FAT32 FAT entries seems to cause a great deal of confusion. Basically 32-bit FAT entries are not really 32-bit values; they are only 28-bit values. For example, all of these 32-bit cluster entry values: 0x10000000, 0xF0000000, and 0x00000000 all indicate that the cluster is FREE, because you ignore the high 4 bits when you read the cluster entry value. If the 32-bit free cluster value is currently 0x30000000 and you want to mark this cluster as bad by storing the value 0x0FFFFFF7 in it. Then the 32-bit entry will contain the value 0x3FFFFFF7 when you are done, because you must preserve the high 4 bits when you write in the 0x0FFFFFF7 bad cluster mark.
Re[9]: Как узнать "размер файла на диске" ?
От: Stanky  
Дата: 23.08.04 19:11
Оценка: :)
> Цитата:
>
Не спорил и не буду, но пока на практике не увижу обратного, останусь при своём мнении!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[2]: Как узнать "размер файла на диске" ?
От: Lukashov Россия  
Дата: 24.08.04 03:39
Оценка:
Здравствуйте, Othello, Вы писали:

O>делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace

O>b-a -> столько и занимал файл!

Отличный способ узнать суммарный размер всех файлов системы!
Жаль, что система не даст все файлы грохнуть
Re[8]: Как узнать"размер файла на диске"?
От: Valerio Россия linkedin.com/in/boronin
Дата: 27.10.04 13:16
Оценка:
Здравствуйте, MShura, Вы писали:

PD>>>>>Да. Но это практически всегда 512.

V>>>>ага, в настоящее время это всегда на x86, без практически

MS>>>На SCSI и MO очень(!) часто BytesPerSector > 512

V>>да, конечно же я имел ввиду жесткие диски
V>>понятно что всякие CD девайсы всегда опять же имеют 2048 байта.

V>>насчет SCSI жестких дисков:

V>>любопытно, есть ли тут серийные устройства (HDD) с размером не 512 на сектор?

MS>Такие устройства есть, поскольку пользователи наших коммерческих программ, у которых жесткие диски имеют сектор не 512 обычно имеют проблемы. Они пишут нам.

MS>Пока это были только SCSI.
кстати, недавно вспомнил откуда у меня была такая уверенность в 512-bytes per sector on HDD
это ATA-5 спецификация для IDE жестких дисков (насчет более новых спецификаций — не узнавал пока)
поэтому неудивительно, что только SCSI попадались
... << RSDN@Home 1.1.4 beta 3 rev. 193>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.