Re[2]: Как узнать "размер файла на диске" ?
От: vgrigor  
Дата: 12.08.04 11:30
Оценка: -2
F>Мысль донес? Только сейчас проверил — файл размером 1 байт занимает на диске 8 Кб — целый кластер, зараза.

А вот и нет...

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

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

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

Не слышали такого?
Винтовку добудешь в бою!
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: Как узнать "размер файла на диске" ?
От: Othello  
Дата: 12.08.04 08:50
Оценка: :)
V>Как узнать "размер файла на диске" ?

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

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

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


V>Спасибо


делаем a = GetDiskFreeSpace — удаяем файл и опять b = GetDiskFreeSpace
b-a -> столько и занимал файл!
... << RSDN@Home 1.1.4 >>
Re[3]: Как узнать "размер файла на диске" ?
От: Stanky  
Дата: 12.08.04 12:03
Оценка: +1
> Файл может быть фрагментирован,
> и считать надо округляя не файл,а каждый фрагмент,
> т.е. столько сколько у файла фрагментов.
>
Какая чушь!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[9]: Как узнать "размер файла на диске" ?
От: Stanky  
Дата: 23.08.04 19:11
Оценка: :)
> Цитата:
>
Не спорил и не буду, но пока на практике не увижу обратного, останусь при своём мнении!!!
Posted via RSDN NNTP Server 1.9 beta
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Как узнать "размер файла на диске" ?
От: 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[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[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[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]: Как узнать "размер файла на диске" ?
От: 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[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...
Пока на собственное сообщение не было ответов, его можно удалить.