Тема: Відновлення даних з образа флешки за відсутності файлової системи
Всім привіт. Спіткала така біда, на флешці з дорогоцінними фото злетіла файлова система. CD-картка з фотоапарата на 32 Гб, на ній востаннє було 411 фото, але після того як з файловою системою сталась біда, звичайно ж комп бачить що всі 30 Гб зайняті чимось, і це не що інше як старі фото. Так ось, я колись вже відновлював фотографії виконуючи задачку з курсів по програмуванню CS50, програмка залишилась.
Зробив образ флешки і трохи змінив програму, все працює, але не довго. Відновлює максимум 507 фото з початку, і зупиняється. Коли за допомогою fseek переходжу в кінець файлу - і ftell-ом дивлюсь позицію - показує максимум 6422144 байт.
Можливо ви підкажете як вийти за ці межі?
Ось код:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc, char* argv[])
{
FILE* cpcard = fopen("raw.img", "rb");
if (cpcard == NULL)
{
printf("could not open file");
return 1;
}
uint8_t bufer[4];
int count = 0;
uint8_t check[5] = {0xff, 0xd8, 0xff, 0xe0, 0xe1};
FILE* picture;
char nameFile[9] = {'0', '0', '0', '/', '.', 'j', 'p', 'g', '\0'};
int flag = 0;
int i;
fseek(cpcard, 0, SEEK_END);
long long len = ftell(cpcard);
printf("%d", &len);
fseek(cpcard, 0, SEEK_SET);
for (i=0; i++; i<1024)
fseek(cpcard, 6422144, SEEK_SET);
while (fread(&bufer, 4, 1, cpcard) > 0)
{
if (bufer[0] == check[0] && bufer[1] == check[1] &&
bufer[2] == check[2] && (bufer[3] == check[3] || bufer[3] == check[4]))
{
// printf('True\n');
picture = fopen(nameFile, "wb");
if (nameFile[3] == '9')
{
if (nameFile[2] == '9')
{
if (nameFile[1] == 9)
{
nameFile[1] = '0';
nameFile[2] = '0';
nameFile[3] = '0';
nameFile[0]++;
}
else
{
nameFile[1]++;
nameFile[2] = '0';
nameFile[3] = '0';
}
}
else
{
nameFile[2]++;
nameFile[3] = '0';
}
}
else nameFile[3]++;
fwrite(&bufer, 4, 1, picture);
while(fread(&bufer, 4, 1, cpcard) > 0)
{
if (bufer[0] == check[0] && bufer[1] == check[1] &&
bufer[2] == check[2] && (bufer[3] == check[3] || bufer[3] == check[4]))
{
count++;
// printf("%d\n", &count);
break;
}
fwrite(&bufer, 4, 1, picture);
}
}
}
fclose(cpcard);
fclose(picture);
return 0;
}
Сам я на С дуже давно не пишу, більше 2 років, все забув вже. Буду дуже вдячним за допомогу.
Можете запропонувати якісь інші методи відновлення даних, дієві. Але задачку з цією програмкою хотілось би все таки вирішити.
Може можна якось файл такого розміру розбити на менші файли?