Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2009, 19:05   #1
xSpikeRx
Новичок
Джуниор
 
Регистрация: 14.12.2009
Сообщений: 2
Хорошо Чтение битого файла на CD небольшой вопрос с кодом

Здравствуйте.
Пишу уже достаточно долго программу в университет которая должна читать файл и занулять битые сектора. Взял на диске ножом сделал 4 царапины глубоких и нашёл битые файлы.
Пробовал и синхронный и асинхронный режим и везде функции подвисают что ReafFile что ReadFileEx... пробовал ставить режим привода DMA и PIO, отключал ErrorControl через реестр но ничего не помогло до сих пор.
Нашёл единственный полностью рабочий выход: когда зависает чтение кластера тогда высовываю диск кнопкой на приводе и по getlasterror = устройство не готово перехватываю этот момент... если продолжаем тогда этот сектор зануляется и гонится дальше копирование. Бэд кластеры в большинстве определяются но бывают такие что подвисает программа и помогает только вышеупомянутое вытягивание диска... пробовал потоками отдельными тоже самое виснут они и не закрываются нивкакую.
Можете что либо иное посоветовать?
Вот мой код чтения выполняемый в основном потоке в асинхронном режиме:
Код:
if (Form1->OpenDialog1->Execute()) { 
hFile = CreateFile(TEXT(Form1->OpenDialog1->FileName.t_str()),	// открываемый файл 
GENERIC_READ, // открываем для чтения 
FILE_SHARE_READ, // для совместного чтения 
0, // защита по умолчанию 
OPEN_EXISTING, // только существующий файл 
FILE_FLAG_OVERLAPPED, // обычный файл 
0); // атрибутов шаблона нет 

hFileOut = CreateFile(TEXT("myfile.txt"), // создаваемый файл 
GENERIC_WRITE, // открывается для записи 
0, // совместно не используется 
0, // защита по умолчанию 
CREATE_ALWAYS, // переписывает существующий 
FILE_ATTRIBUTE_NORMAL, // обычный файл 
0); // атрибутов шаблона нет 
nSize = GetFileSize(hFile, NULL); 
CancelIoEx(hFile, &ol); 
do 
{ 
ol.Offset = cykls * Block; 
ol.OffsetHigh = 0; 
ol.hEvent = CreateEvent(0, true, false, 0); 
ReadFileEx(hFile, buffer, Block, &ol, EndRead); 
DWORD result = WaitForSingleObjectEx(ol.hEvent, 1000,true); 
if (result != WAIT_IO_COMPLETION) { 
error: 
CancelIoEx(hFile, &ol); 
WriteFile(hFileOut, buffer2, Block,&NumberOfBytesWritten, NULL); 
Memo1->Lines->Add(UIntToStr(cykls) +" битый сектор"); 
errorblocks++; 
} 
else 
{ 
CancelIoEx(hFile, &ol); 
GetOverlappedResult(hFile,&ol,&NumberOfBytesRead,false); 
if (GetLastError() == 21) //устройство не готово 
if (MessageDlg("Диск с которого копировался файл был извлечён, если хотите продолжить 
копирование тогда загрузите диск обратно и после появления в системе нажмите ОК, если хотите выйти то нажмите No", 
mtError,TMsgDlgButtons()<<mbyes<<mbno,0)>lines->Add(UIntToStr(cykls) +" "+UIntToStr((unsigned)NumberOfBytesRead)); 
WriteFile(hFileOut, buffer, NumberOfBytesRead,&NumberOfBytesWritten, NULL); 
Memo1->Refresh(); 
} 
cykls++; 
} 
while (nSize >= cykls * Block); 
} 
ext: 
ShowMessage("Количество считанных блоков "+UIntToStr(count)); 
ShowMessage("Ошибок "+UIntToStr(errorblocks)); 
CloseHandle(hFile); 
CloseHandle(hFileOut);
не всё тут совершенно дописано но всётаки заготовочка для обвеса уже есть..
Если будут какие либо предложения то жду =)
На мэйл ответах сказали этот вопрос решается только через драйвер CD-ROM... подскажите конкретнее и я искал уже информацию о драйвере сд-рома но ничего так и не нашёл путного..
Заранее благодарен

Последний раз редактировалось rpy3uH; 24.12.2009 в 11:05.
xSpikeRx вне форума Ответить с цитированием
Старый 21.12.2009, 01:59   #2
xSpikeRx
Новичок
Джуниор
 
Регистрация: 14.12.2009
Сообщений: 2
По умолчанию

пока на API функциях сделал в трёх потоках с отслеживанием на то когда зависает на уничтоженном секторе.. программа копирует и с сети файлы..
http://letitbit.net/download/7563.75...ject1.exe.html
думаю можно удалять тему вопрос исчерпан..

Последний раз редактировалось xSpikeRx; 21.12.2009 в 03:57.
xSpikeRx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшой вопрос про массив grave123 Общие вопросы C/C++ 8 06.12.2009 16:46
небольшой вопрос по перемещению файлов в c# adwaer Помощь студентам 0 05.11.2009 11:08
растянуть RichViewEdit (Небольшой вопрос) Fezilk Общие вопросы Delphi 1 23.08.2009 14:40
Ребята,есть небольшой вопрос по Pascal;) Даник Помощь студентам 2 17.02.2009 00:35
Небольшой вопрос по транспонированию Deman4eg Microsoft Office Excel 11 21.02.2008 11:09