Я видел ::GetDiskFreeSpace() ...Ex()
которая возвращает кажется корректное значение сейчас,
размера кластетра,
свободное пространство,...
почему они не подходят для своего вычисления
(я думал апи есть)
G>Или посмотри в сырцах-за-которые-обещали-надавать-по-шее-но-всем-пофиг CMountPoint::GetClusterSize() (файл MTPT)
А что это за сырцы ?
И почему по шее ?
Сообщите что за страшные и интересные истории, с разведчиками и фашистами были про это?
Здравствуйте, vgrigor, Вы писали:
V>Как узнать "размер файла на диске" ?
V>т.е.не логический размер — 2 байта, V>а сколько он вклюяая полный сектор займет ?
V>Есть такое апи ?
Щас мыслю скажу, а остальные коллеги подтвердят или опровергнут. Значит так: получаете размер кластера при помощи GetDiskFreeSpace. Получаете размер файла при помощи GetFileSize. Смотрите, во сколько кластеров влезает файл (арифметика). Причем если, например, размер кластера 2 байта и размер файла 3 байта, то он занимает на диске 2 кластера, т.е. 4 байта.
Мысль донес? Только сейчас проверил — файл размером 1 байт занимает на диске 8 Кб — целый кластер, зараза.
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.
V>Как узнать "размер файла на диске" ?
V>т.е.не логический размер — 2 байта, V>а сколько он вклюяая полный сектор займет ?
V>Есть такое апи ?
V>Спасибо
делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace
b-a -> столько и занимал файл!
Здравствуйте, Othello, Вы писали:
V>>Как узнать "размер файла на диске" ?
V>>т.е.не логический размер — 2 байта, V>>а сколько он вклюяая полный сектор займет ?
V>>Есть такое апи ?
V>>Спасибо
O>делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace O>b-a -> столько и занимал файл!
упс... тупимс... a-b на самом деле
Здравствуйте, vgrigor, Вы писали:
V>Как узнать "размер файла на диске" ?
V>т.е.не логический размер — 2 байта, V>а сколько он вклюяая полный сектор займет ?
if ( IsNtfs() )
{
// можно поюзать FSCTL_QUERY_ALLOCATED_RANGESif ( IsCompressed() ) // use FSCTL_GET_COMPRESSION
.... // не помнюelse if ( FileSizeInBytes > 300 ) // примерно
{
SizeOnDisk = ((FileSizeInBytes + BytesPerCluster - 1)/BytesPerCluster)*BytesPerCluster;
}
}
else
{
SizeOnDisk = ((FileSizeInBytes + BytesPerCluster - 1)/BytesPerCluster)*BytesPerCluster;
}
Здравствуйте, Stanky, Вы писали:
>> файл займет место кратное кол-ву байт в кластере (для FAT32 — это 32 Кб). >> S>Поправочка: размер кластера в FAT'е зависит от размера раздела!!!
Хорошо: тогда создайте в FAT32 раздел на 40 Гб с размером кластера 4Кб.
Здравствуйте, vgrigor, Вы писали:
V>Файл может быть фрагментирован, V>и считать надо округляя не файл,а каждый фрагмент, V>т.е. столько сколько у файла фрагментов.
И где это такая интересная фрагментация, что все фрагменты файла меньше размера кластера?
Все, что здесь сказано, может и будет использоваться против меня...
> Хорошо: тогда создайте в 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.
Здравствуйте, vgrigor, Вы писали:
V>А что это за сырцы ? V>И почему по шее ? V>Сообщите что за страшные и интересные истории, с разведчиками и фашистами были про это?
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.
Здравствуйте, 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.
O>>делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace O>>b-a -> столько и занимал файл! V>где гарантии что в это время paging file не подрос, tmp file не умер или кто-то другой что-то свое не записал\стер?
ЭЭЭЭ.... НЕТУ!
ИМХО:
Только если это делать как одной — неделимой операцией...
Здравствуйте, Valerio, Вы писали:
V>Здравствуйте, Pavel Dvorkin, Вы писали: >>> т.е. округляется до большего целого и все ? >>> (на любой ОС ?)
PD>>Да. Но это практически всегда 512. V>ага, в настоящее время это всегда на x86, без практически
Здравствуйте, 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.
Здравствуйте, vgrigor, Вы писали:
V>Гранудрование определеяется по
V>BytesPerSector ?
V>т.е. округляется до большего целого и все ? V>(на любой ОС ?)
Файлы выравниваются не по BytesPerSector а по BytesPerClaster. А скока байт в кластере зависит от файловой системы и тем какой размер кластера выбран при ее создании. 512 только для FAT12. Так от 4096 до 65536
>> Хорошо: тогда создайте в 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
Здравствуйте, vgrigor, Вы писали:
V>Как узнать "размер файла на диске" ?
V>т.е.не логический размер — 2 байта, V>а сколько он вклюяая полный сектор займет ?
V>Есть такое апи ?
V>Спасибо
Вопрос, как мне кажется, несложный — то есть как раз для моего уровня развития
Мне кажется, нужно взять размер файла,(вышеупомянутые 2 байта) и округлить вверх до ближайшего числа, равного размеру кластера для данного драйва. Если не ошибаюсь, то API GetDiskFreeSpace и GetDiskFreeSpaceEX возвращают в одном из параметров размер кластера.
Успехов!
Здравствуйте, 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.
Здравствуйте, Valerio, Вы писали:
V>Здравствуйте, MShura, Вы писали:
PD>>>>Да. Но это практически всегда 512. V>>>ага, в настоящее время это всегда на x86, без практически
MS>>На SCSI и MO очень(!) часто BytesPerSector > 512 V>да, конечно же я имел ввиду жесткие диски V>понятно что всякие CD девайсы всегда опять же имеют 2048 байта.
V>насчет SCSI жестких дисков: V>любопытно, есть ли тут серийные устройства (HDD) с размером не 512 на сектор?
Такие устройства есть, поскольку пользователи наших коммерческих программ, у которых жесткие диски имеют сектор не 512 обычно имеют проблемы. Они пишут нам.
Пока это были только SCSI.
> Вы неправы. На FAT32 максимальное кол-во адресуемых кластеров 2^28. Это > написано в спецификации Microsoft на FAT32. >
Спецификацию я конечно не читал, но мои опыты в своё время показали, что максимальное количество кластеров 2^24!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, Stanky, Вы писали:
>> Вы неправы. На FAT32 максимальное кол-во адресуемых кластеров 2^28. Это >> написано в спецификации Microsoft на FAT32. >> S>Спецификацию я конечно не читал, но мои опыты в своё время показали, что максимальное количество кластеров 2^24!!!
Цитата:
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.
Здравствуйте, 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.