Как определить позицию Root Directory в FAT16?с какого сектора она начинается? Пытался найти ответ в книге Advanced MS-DOS Programming(Ray Duncan) ... Везде очень хорошо описывается как найти позицию и size of sub directoriesи так же ещё много чего, но вот самого главного я не нашёл... Заранее благодарен, Ильдар
Если память не изменяет - то к числу зарезервированных секотров (обычно 32) прибавить два раза размер FAT. а вообще, есть перевод официальной доки от мелкософта, там все описано. Прилагаю. _39038555__fatgen102_rus.zip
Привет, Все никак не могу точно определить(наверно из-за малого опыта) Цель создать(с помощъю микроконтроллера PIC16F877 ) фаил на SD/ММС-card в который будет записыватся дата. На ММС - карту можно писать блоки по 512 баит, и читать от 1 до 512 баит. Фаил создаётся в RootDirectory с названием (допустим) measure.csv ММС карта будет заранее отформатированна под FAT16 Примерно реализация будет выглядеть(поправте если где не прав...)вот так: 1. Читаем первый сектор и заполняем ВРВ таблицу которая храница в RAM памяти. Эти вариаблы мы будем часто использовать. 2. Теперь вычисляем с какого сектора начинается RootDirectory по формуле FirstRootDirSecNum = BPB_ResvdSecCnt + (BPB_NumFATs * BPB_FATSz16); 3. читаю сектор который содержит RootDir в RAM, добавляю в RootDirectory новую Entry в которой прописываю Starting Cluster(Это адрес клустера с которого начинается sub-directory или его номер? если адрес, то как это реализуется, как я узнаю что сектор свободный, и существует ли для этого какойто алгоритм? Кажется что свободные сектора содержат F6 F6 F6 ). Пишу уже измененный сектор назад, то есть по адресу с которого я его прочел. В принципе я исхожу из того что карта форматированна, и расчитана на хранение только одного фаила measure.csv тоесть проверок никаких не требуется, значит пишу куда хочу... 4. Пишу по какому то(подскажите???) адресу 2 сектора подряд (1 сluster == 1024 баит) причем не забываю прописать в заголовке кластера ссылку на предыдущии кластер(а что если он первый в ряду, из Entry я ссылаюсь на него???) и следующии. (Вот только я что-то не доганяю про это: -> The FAT maps the data region of the volume by cluster number. The first data cluster is cluster 2... если я правильно понимаю клустер 1 ето был сектор 0 ???? ) 5. Так пишу дату пока она не кончится и фаил нужно будет закрыть. Если это так, в последнем кластере надо записать вместо ссылки на следующии кластер флаг что он последнии. 6. Опять прочесть сектор в котором лежит RootDirectory, наити Entry которое содержит имя measure.csv, изменить fileSize, заполнить там всякое другое (время создания, и.т.д.); записать этот сеkтор назад. 7.конец Я ещё этого никогда не делал, поэтому всё выше написаное есть предложение как я это хочу сделать. Народ помогите чем можете, я уже 3 месяц с проэктом парюсь, всё остальное вроде понятно... вот только это... Заранее благодарен, Ильдар
«3. читаю сектор который содержит RootDir в RAM, добавляю в RootDirectory новую Entry в которой прописываю Starting Cluster(Это адрес клустера с которого начинается sub-directory или его номер? если адрес, то как это реализуется, как я узнаю что сектор свободный, и существует ли для этого какойто алгоритм? Кажется что свободные сектора содержат F6 F6 F6 ).» Во первых, определись с понятиями сектор и кластер. Ты иногда используешь одно, а иногда другое, хотя это разные вещи. И какая разница между адресом кластера и номером? Вообще, там всегда подразумевается номер кластера, т.е., чтоб узнать абсолютное смещение от начала раздела в байтах, его надо умножить на кол-во байтов в кластере. Как узнать, который свободный... Кажется, следом за бут-блоком идет сектор, в конце которого записан номер последнего использованного кластера. Типа, для ускорения работы, чтоб драйверу ФС не лопатить каждый раз всю фат. Но полагаться на него не стоит... Лучше всего считывать всю ФАТ в память и перебирать все записи в поиске нулевой. Если запись равна нулю, значит соответствующий ей кластер свободен. Но к номеру кластера в фат надо приплюсовать еще число кластеров, занятых RootDir, помножить все на число байт в секторе, плюс еще сам фат (два раза) и бутблок – так узнаешь смещение до свободного кластера в байтах от начала раздела. Т.е, элемент фат показывает не номер кластера в разделе, а номер кластера в области данных. Улавливаешь? « В принципе я исхожу из того что карта форматированна, и расчитана на хранение только одного фаила measure.csv тоесть проверок никаких не требуется, значит пишу куда хочу...» А чего ты вообще тада паришься? Карточка твоя всегда одинакового размера будет? Если да – проведи эксперимент. Затри всю карту нулями, вместе с бутсектором и фатом, всю. Потом форматируешь. Сохраняешь образ карты в файл. Записываешь на карту файл размером, к примеру, 400 байт. Сохраняешь образ карты в файл. Увеличиваешь размер файла с 400 до, например, 4k байт. Сохраняешь образ карты в файл. А потом берешь и внимательно изучаешь(с помощью того же TotalCommander, он умеет сравнивать файлы), чем пустая карта отличается от карты с файлом, и что меняется в ФАТе и в области данных при увеличении размера файла. Может быть, для тебя это будет проще, чем изучать доку по ФАТ. По крайней мере, я примерно так делал – читал доку, потом предлагал ОС самой поработать с диском, внимательнейшим образом следил за ее действиями, потом опять читал доку. «4. а что если он первый в ряду, из Entry я ссылаюсь на него» Правильно, ты ссылаешься на первый кластер своего файла, пишешь туда данные. Если твой файл целиком влез в этот файл, то в элементе фата, соответствующем данному кластеру, ты пишешь, что этот кластер - последний. Первый, единственный и последний Если же нет – пишешь в нем номер следующего кластера, принадлежащего файлу (в твоем случае, это будет кластер, следующий за первым, ведь у тебя только один файл.), пишешь данные в этот кластер. Как запишешь, то опять, в элементе фата для этого кластера пишешь либо признак конца, либо номер следующего.
nin Свободный кластер надо искать в FAT-таблице. Она содержит номер следующего кластера, признак последнего кластера или признак свободного кластера. Какие коды не помню : ищи в доках или просто посмотри. Очень хорошо все что ты спрашиваешь показывает diskedit из Norton Utilties. И где root и что в FAT ...