#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
const unsigned int bufSize = 1024;
int main(int argc, char** argv)
{
FILE* disk = fopen("\\\\.\\L:","r");
char buf[bufSize];
if (disk == NULL)
{
printf("Can't open disk\n");
getch();
return -1;
}
FILE* image = fopen("D:\\Image.file","w+");
if (image == NULL)
{
printf("Can't open file for image\n");
getch();
return -1;
}
unsigned int i = 0;
unsigned int count = 0;
while (/*!feof(disk)*/count = fread(&buf,1,bufSize,disk))
{
//system("cls");
printf("%u bytes\n",bufSize*i+count);
fwrite(&buf,1,count,image);
i++;
}
fclose(disk);
fclose(image);
printf("Done. Press any key.\n");
getch();
return 1;
}
образ диска
Хотел снять образ флэшки, но где-то ошибся - читает только первые 140-350 байт (в зависимости от устройства).
Вы открываете диск как текстовый, не бинарный, файл.
Спасибо.
Как открыть флэшку для записи образа? ... или может где-то в другом месте ошибка
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
const unsigned int bufSize = 524288;//4096;
int main(int argc, char** argv)
{
//FILE* disk = fopen("\\\\.\\L:","rb");
FILE* disk = fopen("D:\\temp\\flash\\image.file","rb");
char buf[bufSize];
if (disk == NULL)
{
printf("Can't open file to read\n");
getch();
return -1;
}
//FILE* image = fopen("D:\\Image.file","w+");
FILE* image = fopen("\\\\.\\I:","ab");
if (image == NULL)
{
printf("Can't open file to write\n");
getch();
return -1;
}
fseek(image,0,SEEK_SET);
unsigned int i = fseek(image,0,SEEK_SET);
unsigned int count = 0;
unsigned int countw = 0;
int pos1 = 0,pos2 = 0;
while (/*!feof(disk)*/count = fread(&buf,1,bufSize,disk))
{
system("cls");
printf("%u B | %u KB | %.2f MB\n",bufSize*i+count,
int(float(bufSize*i+count)/(float)1024),
float(bufSize*i+count)/(float)1024/1024);
pos1 = fseek(image,0,SEEK_CUR);
if ((countw = fwrite(&buf,1,count,image)) != count)
{
printf("Error during writing occured\n");
printf("Tryeid to write: %d Bytes, but done: %d Bytes",count,countw);
fclose(disk);
fclose(image);
getch();
return -1;
};
pos2 = fseek(image,0,SEEK_CUR);
printf("pos1: %d, pos2: %d\n",pos1,pos2);
if (pos1 == pos2) fseek(image,count,SEEK_CUR);
if (fflush(image) != 0)
{
printf("Error during flushing occured\n");
fclose(disk);
fclose(image);
getch();
return -1;
};
i++;
}
fclose(disk);
fclose(image);
printf("Done. Press any key.\n");
getch();
return 1;
}
#include <stdlib.h>
#include <conio.h>
const unsigned int bufSize = 524288;//4096;
int main(int argc, char** argv)
{
//FILE* disk = fopen("\\\\.\\L:","rb");
FILE* disk = fopen("D:\\temp\\flash\\image.file","rb");
char buf[bufSize];
if (disk == NULL)
{
printf("Can't open file to read\n");
getch();
return -1;
}
//FILE* image = fopen("D:\\Image.file","w+");
FILE* image = fopen("\\\\.\\I:","ab");
if (image == NULL)
{
printf("Can't open file to write\n");
getch();
return -1;
}
fseek(image,0,SEEK_SET);
unsigned int i = fseek(image,0,SEEK_SET);
unsigned int count = 0;
unsigned int countw = 0;
int pos1 = 0,pos2 = 0;
while (/*!feof(disk)*/count = fread(&buf,1,bufSize,disk))
{
system("cls");
printf("%u B | %u KB | %.2f MB\n",bufSize*i+count,
int(float(bufSize*i+count)/(float)1024),
float(bufSize*i+count)/(float)1024/1024);
pos1 = fseek(image,0,SEEK_CUR);
if ((countw = fwrite(&buf,1,count,image)) != count)
{
printf("Error during writing occured\n");
printf("Tryeid to write: %d Bytes, but done: %d Bytes",count,countw);
fclose(disk);
fclose(image);
getch();
return -1;
};
pos2 = fseek(image,0,SEEK_CUR);
printf("pos1: %d, pos2: %d\n",pos1,pos2);
if (pos1 == pos2) fseek(image,count,SEEK_CUR);
if (fflush(image) != 0)
{
printf("Error during flushing occured\n");
fclose(disk);
fclose(image);
getch();
return -1;
};
i++;
}
fclose(disk);
fclose(image);
printf("Done. Press any key.\n");
getch();
return 1;
}
fopen("\\\\.\\I:","w") и fopen("\\\\.\\I:","wb") возвращают NULL
Записывается около полутора мегабайт и появляется ошибка (countw != count)
А WinAPI пользовать можно?Если что,могу подсказать
Интересно, почему через стандартные "сишные" функции не вышло.