Ограничение размера файла на FAT32

Gasparfx

Есть ли какое? Пытаюсь скачать DVD образ размером 4.5Гб, при закачке 90% говорит, что диск полный, хотя место ещё есть...

sinet

Есть
Как раз 4Gb

voronetskaya

цифра 32 в слове FAT32 ни о чем не говорит?

Serega009

Ты не прав!
32 в названии FAT32 говорит лишь об ограничении на количество кластеров (32 бита, т.е. 2^32 кластера). Например на дискетках применяется FAT12, т.е. кластеров там может быть не более 2^12 = 4096 кластеров, а значит каждый элемент FAT (File Allocation Table) имеет размер 12 бит, а в FAT32 соответственно 32 бита.
В DOS'е (FAT16) ограничение на размер файла было 2^32 байт (в RootDirectory полю, отвечающему за размер файла, выделено 4 байта, т.е. 32 бита). Можно предположить, что это же ограничение осталось в FAT16 под виндой и, возможно, в FAT32.

sinet

И ты не прав.
В FAT16 максимальный размер файла 2^31=2Gb.

hoha32

Внутренняя адресация FAT - 64 бита. Поэтому файлы больше 4 Гб вполне спокойно жили у меня на винте

Serega009

Почему же 2^31 ? Хочешь сказать там ещё знаковый бит?

Serega009

Может объяснишь, что подразумевается под "внутренней адресацией FAT"? Я не очень это понимаю...

sinet

Хз. Просто так есть.

hoha32

Хрен знает, где-то увидел... ща пытаюсь выяснить не спутал ли я 2 гига и 4 гига - не помню про какое ограничение на ФАТ-32 писали раньше. Больше двух гигов исошник был точно, а вот был ли ещё один 3.7 гига или 4.7 гига - не помню . Так что походу я фигню сморозил, но проверить интересно. Если есть где образец такого файла - подскажите плз.

otvertka07

2^32 - 1 bytes RTFM UMFB

Makc500

чуве, бери кулькулятор и считай

Serega009

Ну откуда-то ты это взял?!
Я вот знаю, что под DOS'ом элемент RootDirectory представляется как следующая структура:
struct _dir_type {
char[8] name;
char[3] ext;
char attr;
char[10] reserv; // добавка до размера структуры 32 байта
unsigned int16 time, date, firstC; // насчёт типа не уверен, но под каждое поле- 2 байта
unsigned int32 size;
}
В расширении FAT резерв используется для увеличения длины имени файла (там ещё хитрее устроено, поскольку для одного файла может быть выделено более одного элемента RootDirectory, что позволяет поддерживать и DOS).
Вообще о структуре диска я узнал из книжки Фаронова по паскалю, а там поля time, date, firstC имеют тип Word (целочисленный беззнаковый, 2 байта а size - LongInt (целочисленный со знаком, 4 бата- целочисленного беззнакового, 4 байта там нет! поэтому я точно сказать не могу, но логично предположить и это скорее всего, что знакового бита там нет!
Сейчас у меня нет под рукой источника, в котором описывается данная структура на С и притом для FAT16 под винду (расширенный FAT но я обязательно посмотрю!

Serega009

Забей на 1 байт- это константа =)
Кстати что такое UMFB?
Про RTFM я знаю...

Makc500

люди, вы вообще о чем?

sinet

Дак просто 31 бит используют из 32. Меньше описать выравнивание не позволяет.
Под рукой у меня мануала нету, но в инете на любом сайте написано.

hoha32

Ща в инете порылся - точно 4 гига. облом.

Serega009

Ну да!
Я посмотрел в одной проге (LFN- long file name, которая может делать многие вещи с FAT32, FAT 16, FAT12, а также читать CD с файловой системой ISO либо Joliet- мощная прога- своими силами- она написана под DOS)- насколько смог понять, даже в FAT32 используется 4 байта под размер файла.
struct longdirentry {
char[8] name;
char[3] ext;
char[8] reserv;
word high_cluster; // старшее слово first_cluster в FAT32
word time;
word date;
word first_cluster; // номер первого кластера
dword length; // размер файла!
}
Ну вот такая вот структура элемента RootDirectory

Makc500

размер кластера у вас какой?

Gasparfx

Лежит на разделе fat32 файл 3.5Гб, а тот который 4.5Гб не записался. Пришлось на системный NTFS записываь.
А кто нибуть знает о таких же огранченияз на ext2?

buba741

Ща в инете порылся - точно 4 гига. облом.
Проще в сырцы fastfat'а залезть


INLINE
BOOLEAN
FatIsIoRangeValid (
IN PVCB Vcb,
IN LARGE_INTEGER Start,
IN ULONG Length
)
/*++
Routine Description:
This routine enforces the restriction that object space must be
representable in 32 bits.
Arguments:
Vcb - the volume the range is on
Start - starting byte (zero based) of the range
Length - size of the range
Return Value:
BOOLEAN - if, considering the cluster size, the neccesary size of
the object to contain the range can be represented in 32 bits.
--*/
{
//
// The only restriction on a FAT object is that the filesize must
// fit in 32bits, i.e. <= 0xffffffff. This then implies that the
// range of valid byte offsets is [0, fffffffe].
//
// Two phases which check for illegality
//
// - if the high 32bits are nonzero
// - if the length would cause a 32bit overflow
//
return !(Start.HighPart ||
Start.LowPart + Length < Start.LowPart);
}

hoha32

А що це такэ? Я в mount_msdosfs полез, да там вообще тухло
Оставить комментарий
Имя или ник:
Комментарий: