Как узнать "размер файла на диске" ?
От: 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.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.