Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Копирование битых файлов.   Найти похожие ветки 

 
dracula ©   (2005-09-29 14:14) [0]

Может кто подскажет... делаю копирование битого файла с дискеты, казалось бы всё просто читаем файл, нечитаемые сектора заменяем нолями, но как програмно это дело сделать? не знаю.  В каком направлении копать.. =( Может в винде есть флаги на установку количества раз чтения битого сектора, или чтоб вообще нафиг битые пропускал)... Если кто знает какю информацию по этому поводу помогите плз.


 
avsam ©   (2005-09-29 14:40) [1]

Я бы читал блоками по 512 байт (BlockRead в буфер длиной 512 байт).
Если выдает ошибку - забиваешь буфер нолями.
Есть другие идеи?


 
dracula ©   (2005-09-29 14:44) [2]

Да я так пробывал сделать, но очень долго... вот меня и интересуют флаги, допустим есть битый сектор и винда начинает дисковод по нескольку раз гонять, вот как изменить эти несколько раз на нужное мне число, и перехватив сообщение об ошибке начать читать следующий сектор.


 
Kulakov_an   (2005-09-29 16:06) [3]

Что-то с директивами насколько помню перед чтением ставишь  {I-} или {O-}тогда можно будет без ошибки обработать обработать ошибку этого (система проигнорирует ошибку) потом закроешь {I+} точно непомню но покапайсяпо этим дерективам я давно длал такую прогу но сейчас ни документашки нет посмотреть негде и на память тоже точно  непомню


 
XGarik ©   (2005-09-29 16:13) [4]

Это называется IOResult!


 
Grief ©   (2005-09-29 16:58) [5]

советую сделать сначала длинный буфер, а при наличии сбоев его уменьшить.


 
dracula ©   (2005-10-11 12:13) [6]

Grief ©   (29.09.05 16:58) [5]
советую сделать сначала длинный буфер, а при наличии сбоев его уменьшить.

Это уже всё сделано, всё работает, и файлы битые вытаскивает... Надо только уменьшить количество раз чтения битого сектора, вот на этом застрял, в винде наверняка есть флаги в которых это указываеться (сколько раз читать битый сектор после чего он считается битым) вот как это сделать? Я конечно сейчас в MSDN пороюсь, но может кто так знает...


 
Игорь Шевченко ©   (2005-10-11 12:18) [7]


> (сколько раз читать битый сектор после чего он считается
> битым)


Один


 
dracula ©   (2005-10-11 12:29) [8]

Ну это правильно, но винда читает больше, а как ей сказать чтоб она читала один =)


 
Игорь Шевченко ©   (2005-10-11 13:00) [9]

dracula ©   (11.10.05 12:29) [8]

"Винда" читает тоже один раз. Много раз читает драйвер флопа. Ему сказать нельзя вроде.


 
dracula ©   (2005-10-11 13:41) [10]

Да, точно... драйвер читает, и ему вроде как сказать можно =)

Установка количества повторов при обращении к файлу (440Bh)
Вызов:

Регистр Содержание
AH 44h
AL 0Bh
CX Продолжительность паузы (по умолчанию используется значение 1)  
DX Число повторов (по умолчанию равно 3) до вызова программы обработки прерывания INT 24h (прерывания по критической ошибке ввода/вывода)  

Выполнение без ошибки:
Регистр CF Содержание  0


Выполнение с ошибкой:
Регистр CF 1 Содержание AX 01h - запрошена несуществующая функция  

Щас попробую... к дровам обратится


 
Starcom ©   (2005-10-11 13:42) [11]

dracula ©   (29.09.05 14:14)

А зачем тебе сие А? хочеш чтоб только твоя прога читала данные и никто боле!


 
dracula ©   (2005-10-11 13:45) [12]


> хочеш чтоб только твоя прога читала данные и никто боле!

Для этого есть решение намного проще.
Мне просто надо битые файлы вытаскивать с дискет, и не по пол часа ждать, а по быстрому =) всё просто.


 
Starcom ©   (2005-10-11 13:47) [13]

dracula ©   (11.10.05 13:45) [12]

А ты неиспользуй тогда дискеты вообще, Flash, CD!


 
dracula ©   (2005-10-11 13:51) [14]

Да... так было бы проще, но для них мне тоже надо написать такую же функцию по вытаскиванию битых файлов. Просто я начал с самого лёгкого - это дискета, а там буду вносить поправки и переделывать на остальные типы носителей.


 
Игорь Шевченко ©   (2005-10-11 14:48) [15]

dracula ©   (11.10.05 13:41) [10]


> Установка количества повторов при обращении к файлу (440Bh)


Это в ДОСе. Причем здесь Windows я не совсем понимаю. Тем более, причем здесь Delphi.


 
dracula ©   (2005-10-11 14:56) [16]

Да я понял, что в досе... =(
Сейчас ищу под винду (должно же быть решение), а на счёт дельфы, так мне хоть на чём нибудь, а то совсем зацепится незачто. Если только свои дрова писать =), но до этого я не дорос пока (к сожалению).


 
AlexWlad ©   (2005-10-11 19:39) [17]


> Игорь Шевченко ©   (11.10.05 13:00) [9]
> "Винда" читает тоже один раз. Много раз читает драйвер флопа.
>  Ему сказать нельзя вроде.


А может не драйвер, а контроллер?


 
Игорь Шевченко ©   (2005-10-11 23:59) [18]

AlexWlad ©   (11.10.05 19:39) [17]

Драйвер - точно, насчет контроллера - не помню, врать не буду.


 
Германн ©   (2005-10-12 01:44) [19]


> Игорь Шевченко ©   (11.10.05 13:00) [9]
>
> Много раз читает драйвер флопа.
>  Ему сказать нельзя вроде.


Странно это. Если в даже в ДОСе ему можно было сказать. Так с чего бы "зауживать" возможности ОС?


 
Erik1 ©   (2005-10-12 11:44) [20]

Насколько я помню есть команда обращения к драйверу DeviceIoControl, возможно стоит посмотреть в этом направлении.


 
Vladimir88   (2005-10-12 16:26) [21]

Может делать всё это в консольном приложении, вроде как для консольных приложений винда разрешает прямое обращение к девайсам как в досе :).


 
Игорь Шевченко ©   (2005-10-12 16:42) [22]


>  вроде как для консольных приложений винда разрешает прямое
> обращение к девайсам как в досе


Не разрешает


 
Vladimir88   (2005-10-12 16:46) [23]


> Игорь Шевченко ©   (12.10.05 16:42) [22]
>
> Не разрешает


У меня с COM-портами прокатывало, через обычные прерывания, как в досе :).


 
Игорь Шевченко ©   (2005-10-12 17:37) [24]

Vladimir88   (12.10.05 16:46) [23]

Это наверное зависит не от консольности, а от версии Windows ?


 
-=S..S=-   (2005-10-12 17:48) [25]

NT не пропускает 9x пропускает прямые вызовы к устройствам


 
dracula ©   (2005-10-13 12:40) [26]

Я так думаю надо копать в направлении дров, всё должно быть просто (как в досе). Самое интересное и в MSDN нет ничего про это (или я искал плохо).


 
Игорь Шевченко ©   (2005-10-13 12:42) [27]

dracula ©   (13.10.05 12:40) [26]

А зачем такие сложности ?


 
dracula ©   (2005-10-13 13:38) [28]

Игорь Шевченко ©

А можеш посоветуешь как проще? Вся проблема в том что мне надо получить контроль над количеством повтором чтения плохого сектора, и время между этими повторами.


 
Defunct ©   (2005-10-13 13:45) [29]

dracula ©   (13.10.05 13:38) [28]

хотите подкину программку посекторного копирования дискетки, на другую дискетку, где игнорируются все битые сектора (программка на TP7).


 
Defunct ©   (2005-10-13 13:50) [30]

-=S..S=-   (12.10.05 17:48) [25]

Зато NTVDM пропускает обращения к INT 13h


 
Игорь Шевченко ©   (2005-10-13 13:53) [31]

dracula ©   (13.10.05 13:38) [28]

Могу посоветовать - не прочитался - сектор битый. И все.


 
dracula ©   (2005-10-13 14:55) [32]

Удалено модератором
Примечание: Личная переписка


 
Игорь Шевченко ©   (2005-10-13 15:31) [33]

dracula ©   (13.10.05 14:55) [32]


> Неее... так не пойдёт. Совет может и хороший но не в тему
> =)


А почему не пойдет ?


 
dracula ©   (2005-10-13 15:41) [34]

> Могу посоветовать - не прочитался - сектор битый. И все.

В винде по умолчанию плохой сектор читается три раза, потом он считается плохим... Вот например копирую я файл, натыкаюсь на битый сектор и он читается три раза, если не прочитался пишу вместо него ноли в файл, читаю следующий сектор если битый то опять пишу ноли и т.д. это всё работает отлично, но очень долго... поэтому не пойдёт так просто, точнее пойдёт, но если читать битый сектор не три раза, а один - вот это то что мне нужно. Чтоб битый сектор читался один раз, так как и нормальный... ну не прочитался и фиг с ним, нолями забью. Простым языком говоря - просто пропускать плохие сектора на лету.


 
Игорь Шевченко ©   (2005-10-13 16:42) [35]

dracula ©   (13.10.05 15:41) [34]

Я бы на твоем месте подождал и не мучился. Если учесть, что дискеты сейчас стали отвратные, то вообще овчинка выделки не стоит - битые файлы копировать.


 
Virgo_Style ©   (2005-10-13 21:10) [36]

Игорь Шевченко ©   (13.10.05 16:42) [35]
овчинка выделки не стоит - битые файлы копировать.


Я фильм с поцарапанного CD копировал :-) Хотя насчет стоимости выделки, пожалуй, согласен. Делать было нечего =)


 
Джо ©   (2005-10-13 21:41) [37]

2Автор.
А зачем отказываться от дальнейшего чтения если не прочитался 1-й раз? Очень вероятно, что после 2-3 попыток все-же прочитается. Так зачем заведомо лишать себя шансов прочитать сектор, и записывать его сразу в "хлам".


 
Игорь Шевченко ©   (2005-10-13 22:32) [38]

Virgo_Style ©   (13.10.05 21:10) [36]

Я EAC-ом с поцарапанного пестню оцифровывал. Но долго, часа четыре. Оцифровал, в итоге, даже на слух без запинок :)


 
Virgo_Style ©   (2005-10-13 23:27) [39]

Игорь Шевченко ©   (13.10.05 22:32) [38]
Но долго, часа четыре.


Хм... Я уже не помню, сколько он у меня копировался. Я его на ночь оставлял. Раза два-три-четыре. :o)

Джо ©   (13.10.05 21:41) [37]
А зачем отказываться от дальнейшего чтения если не прочитался 1-й раз?


Кстати, меня заинтересовал такой момент (сразу скажу, что кривость рук не исключаю): я читал блоками (по сколько-то килобайт, уже не помню), а если блок не читался - пытался читать побайтово, от начала и от конца блока шел "внутрь", пытаясь спасти по возможности больше данных.
Так вот, нередко блок не читался, но побайтовое чтение проходило без ошибок.

Читал, кстати, старым добрым BlockRead. Может, потому так долго и получалось =))


 
Игорь Шевченко ©   (2005-10-13 23:32) [40]

Virgo_Style ©   (13.10.05 23:27) [39]


> Так вот, нередко блок не читался, но побайтовое чтение проходило
> без ошибок.


Похоже, ты просто увеличивал количество повторов, устройство все равно читает блоками.



Страницы: 1 2 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.047 c
3-1128317628
RUYurik
2005-10-03 09:33
2005.11.13
IBReplicator


11-1111562044
Uli
2005-03-23 10:14
2005.11.13
Обход компонент???


14-1129960960
Starcom
2005-10-22 10:02
2005.11.13
Софтина для печати фотографий размером 3,5 на 4,5 мм!


14-1129731129
oldman
2005-10-19 18:12
2005.11.13
Вот такая вот задачка по физике :)))


3-1128259959
alpine
2005-10-02 17:32
2005.11.13
Вопрос по SQL запросу