Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
i++;
break;
}
}
tmp_name_buff[n] = ' ';
Заполняем структуру struct split_name sn соответствующей информацией. Заполнение выполняет функция split_name, при этом выполняется проверка имени файла на соответствие формату «8.3»:
if(split_name(tmp_name_buff, &sn) < 0) {
printf("not valid name ");
return -1;
}
Для каждого элемента полного имени файла определяем начальный кластер. Для этого ищем в элементах каталога (начиная с корневого) запись, соответствующую элементу полного имени, и считываем эту запись. Процедуру поиска выполняет функция get_dentry():
if(get_dentry(&sn) < 0) {
printf("No such file! ");
return -1;
}
Проверяем атрибуты файла. Если это каталог, считываем его содержимое и продолжаем цикл:
if(dentry.attr & 0x10) {
if(read_directory(dentry.start) < 0) return -1;
continue;
}
Если это файл – считываем первые num кластеров. Для контроля считанную информацию сохраним в отдельном файле:
if(dentry.attr & 0x20) {
start_cluster = dentry.start;
tmp_buff = (__u8 *)malloc(byte_per_cluster); // сюда будет считываться содержимое кластера
n = open("clust", O_CREAT|O_RDWR, 0600); // в этом файле сохраним считанную информацию
if(n < 0) {
perror("open");
return -1;
}
printf("file`s first cluster - 0x%X .. ", start_cluster);
Для считывания кластеров файла организуем цикл:
for(i = 0; i < num; i++) {
memset(tmp_buff, 0, byte_per_cluster);
Считываем содержимое кластера в буфер tmp_buff и сохраняем его в отдельном файле:
if(read_cluster(start_cluster, tmp_buff) < 0) return -1;
if(write(n, tmp_buff, byte_per_cluster) < 0) {
perror("write");
close(n);
return -1;
}
Считываем из FAT16 номер следующего кластера, занятого под данный файл. Если это последний кластер – прерываем цикл и возвращаемся в главную функцию:
next_cluster = fat16[start_cluster];
#ifdef DEBUG
printf("OK. Readed ");
printf("file`s next cluster - 0x%X .. ", next_cluster);
#endif