В любом случае ты должен знать структуру FAT16 и FAT32. Последовательное чтение из файла значительно проще реализовать, чем полномасштабную работу с файловой системой, где помимо существенно большего числа операций в обязательном порядке используется еще и кэширование. Я писал код для последовательного чтения файла только из корневого каталога. Алгоритм примерно такой:
1. Для поиска нужной файловой записи поочередно читаешь блоки корневого каталога. Для FAT32 уже на этом этапе выполняется работа с таблицей FAT. Вообще в этом алгоритме достаточно выполнять кэширование по единственному последнему блоку FAT. При использовании только коротких имен файлов достаточно читать блоки каталога по одному, т.к. размер файловой записи равен 32 байта, т.е. всегда кратен размеру блока. Длинные имена распределены по нескольким файловым записям, поэтому может случиться так, что отдельные фрагменты имени хранятся в разных блоках. В этом случае ты должен "собирать" имя в отдельном буфере или кэшировать несколько блоков каталога.
2. Если нужная запись найдена и проверена (как минимум нужно убедиться, что ты нашел именно файл), то из нее выбираешь начальный номер кластера и размер файла в байтах.
3. Ну и собственно последовательно читаешь блоки файла, опять кэшируя FAT по единственному последнему с помощью все того же кода, что использовался и при чтении каталога FAT32. Здесь следует заметить только то, что если буфер для файла жестко ограничен сверху, то фрагмент из последнего блока файла может потребоваться считать через кэш-буфер, т.к. сам последний фрагмент может умещаться в файловом буфере, а последний блок файла, в котором он содержится, - нет. Ну и здесь же имеет смысл проверить наличие терминатора в FAT-цепочке файла. Его присутствие будет говорить о непротиворечивости размера файла и его FAT-цепочки. Т.е. можно с большей долей уверенности говорить, что файл прочитан полностью, а файловая система хотя бы здесь не содержит логических ошибок.
|