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

Вниз

Неповрежденные части файлов с диска A:    Найти похожие ветки 

 
Dr. Genius   (2004-10-19 17:35) [0]

Собираюсь сейчас приступить к написанию программы, позволяющей считывать поврежденные файлы из поврежденных дискет (точнее – считывать неповрежденные части файлов с дискет). Я знаю, что существует много программ подобного рода, но мне хочется написать самому. Я не знаю, по какому принципу она должна работать, чтобы уметь считывать неповрежденные части поврежденных файлов. Каким должен быть алгоритм работы такой программы? Если кто знает, подскажите.


 
Pentium133 ©   (2004-10-19 17:42) [1]

Наверно напримую работа с FAT и считывание секторов с последующим собиранием в файл. Битые сектора пропускаются.
НО это ИМХО. Я таких программ не писал.


 
ЮЮ ©   (2004-10-20 03:41) [2]

Если файл не текстовый, то этим ничего не спасешь. Открываешь как file of byte и считываешь по 1-му, обрабатывая ощибки.


 
Mim1 ©   (2004-10-20 06:22) [3]


>  считываешь по 1-му, обрабатывая ощибки.

С неповрежденной дискеткой это займет годы :). Лучше уменьшать размер буфера в звависимости от наличия ошибок.


 
Anatoly Podgoretsky ©   (2004-10-20 07:38) [4]

А зачем по байту? 512 байт размер сектора.


 
VMcL ©   (2004-10-20 07:39) [5]

>>ЮЮ ©  (20.10.04 03:41) [2]

Поскольку на современных дискетах (гы, современных) размер сектора/кластера = 512 байт, то лучше считывать блоками по 512 байт, ИМХО (а точнее блоками по столько байт, сколько вернет ф-ция GetDiskFreeSpace в параметре lpSectorsPerCluster или хотя бы lpBytesPerSector).


 
GanibalLector ©   (2004-10-20 09:41) [6]

2 VMcL
ф-ция GetDiskFreeSpace в параметре lpSectorsPerCluster
Которая корректно работает только в XP


 
VMcL ©   (2004-10-20 10:55) [7]

>>VMcL ©  (20.10.04 07:39) [5]

>сколько вернет ф-ция GetDiskFreeSpace в параметре lpSectorsPerCluster или хотя бы lpBytesPerSector

Сколько вернет ф-ция GetDiskFreeSpace в параметрах (lpSectorsPerCluster * lpBytesPerSector) или хотя бы просто lpBytesPerSector.

>>GanibalLector ©  (20.10.04 09:41) [6]

Remarks

Windows Me/98/95:  For volumes that are larger than 2 GB, the GetDiskFreeSpace function may return misleading values. The function caps the values stored into *lpNumberOfFreeClusters and *lpTotalNumberOfClusters so as to never report volume sizes that are greater than 2 GB. On volumes that are smaller than 2 GB with an actual sectors per cluster greater than 64, *lpSectorsPerCluster will be capped at 64 and the values stored into *lpSectorsPerCluster, *lpNumberOfFreeClusters, and *lpTotalNumberOfClusters will be incorrect. That is because the operating system adjusts the values so that computations with them yield the correct volume size with the capped *lpSectorsPerCluster.


Во-первых, про lpBytesPerSector ничего не сказано, а можно обойтись только этим значением.

Во-вторых, дискет размером больше 2 ГБ я лично не встречал, а у тех, которые меньше 2 ГБ, не встречал количество секторов на кластер больше 64.


 
Amoeba ©   (2004-10-20 11:40) [8]

Удалено модератором


 
Pentium133 ©   (2004-10-20 11:44) [9]

Если быть точнее, нужно работать именно напрямую с секторами диска, т.к. в случае сбойного файла система не даст его даже открыть.
 Коллеги, давайте вспомним MS-DOS! Разве есть системная функция (прерывание), которая позволяет при прямомо обращении к диску прочитать указанно количество байтов? Помоему нет. Еденица чтения информации - это кластер.
 Я правда не знаю как с прямым доступом к дискетам у Windows, но наверника идеология не поменялась.


 
VMcL ©   (2004-10-20 11:53) [10]

>>Pentium133 ©  (20.10.04 11:44) [9]

>>т.к. в случае сбойного файла система не даст его даже открыть.

То есть, по-твоему, перед тем, как открыть файл система его полностью сканирует, проверяя есть ли в цепочке используемых им кластеров сбойные?


 
Sun bittern ©   (2004-10-20 11:54) [11]

>> Еденица чтения информации - это кластер.

Это что-то новое


 
Sam Stone ©   (2004-10-20 13:27) [12]

Уж звиняйте, что на асме. Просто лабу такую писал. Суть: скопировать дискету полностью(просто копирую сектора без разбора, вместе с фатом). Вроде последний вариант, должен быть без ошибок. По крайней мере для начала сойдет.
И еще: изучи фат дискеточный. Если надо - могу кинуть немного теории.
.model small
.486
.stack 100h
.data
eof dw 0
fn db "c:\diska.bin",0
handle dw 0
buf db 18*512 dup(0)
numread dw 0
ptrlo dw 0
ptrhi dw 0
blockSize dw 18*512
errmsg db "error",24h
.code

OpenFile PROC
mov dx, offset fn      ; Загрузка файла
mov handle,0            ; Подготовим идентификатор
mov ah,3Dh               ; Функция открытия
mov al,0                     ; Флаг - Только для чтения (0)
int 21h                       ; Вызов функции
jc OF2                      ; Если ошибка, то выход

OF1:
mov handle,ax

OF2:
ret

OpenFile ENDP

CloseFile PROC
mov bx, handle   ; Загрузка идентификатора
mov ah, 3eh       ; Функция закрытия
int 21h              
ret
CloseFile ENDP

; Создание нового файла
CreateFile PROC

mov dx, offset fn    ; Загрузка имени файла
mov handle,0
mov cx,0
mov ah,3ch         ; Функция создания файла
mov al,0
int 21h
jc CF1                 ; Ошибка открытия
mov handle,ax    ; Сохранение идентификатора

CF1: ret
CreateFile ENDP

; Запись в файл
WriteData PROC

mov ah,40h                ; Функция записи в файл
mov bx, handle         ; Загрузка идентификатора
mov cx, BlockSize           ; Размер буфера для записи
mov dx, offset Buf   ; Указатель на буфер
int 21h
ret
WriteData ENDP

; Чтение из файла
ReadData PROC

mov [eof],0                               ; Сбросим флаг
mov ah,3fh                               ; Функция чтения из файла
mov bx,handle                          ; Загрузить идентификатор
mov cx,BlockSize                             ; Размер буфера
mov dx, offset Buf                   ; Указатель на буфер
int 21h    
jc RD2                                      ; Если ошибка чтения

mov word ptr [numread], ax   ; Сохранить количество прочитанных байт
cmp ax,cx                                ; Все ли байты прочитаны?
je RD3

RD1:
mov [eof],1
jmp RD3

RD2:
cmp ax,0                          ; Обнаружен ли конец файла
cmp ax,0
je RD1
;...                                      ; Здесь должна быть обработка ошибки
RD3:
ret

ReadData ENDP

SetPointer PROC

mov ah,42h              ; Функция перемещения указателя
mov al,01h               ; Флаг - от текущей позиции (1), от начала файла (0), от конца файла (2)
mov bx,handle        ; Загрузка идентификатора
mov cx, ptrHI         ; Старшая часть смещения
mov dx, ptrLO       ; Младшая часть смещения    (CX:DX   - 32 bit Смещение )
int 21h

ret
SetPointer ENDP

i db 0
j db 0
n db 0
start:
mov ax,@data
mov ds,ax
mov es,ax

jmp my111

call CreateFile
m2:
mov j,0
mov n,0
m1:
jmp norstread
rstread:
mov ah,0
int 13h
norstread:
mov ah,2
mov al,18;количество секторов
mov ch,j;дорожка
mov cl,1;сектор
mov dh,i;сторона
mov dl,0;дисковод
lea bx,buf
int 13h

jnc b1
inc n
mov bl,n
cmp bl,3
jb rstread
jnb therend

b1: call WriteData
mov ptrhi,0
mov ptrlo,blockSize
call SetPointer
mov n,0
inc j
mov al,j
cmp al,79
jna m1

inc i
mov al,i
cmp al,1
jna m2
;записали всю дискету в файл
call closefile
jmp theend
mov ah,1
int 21h;ждем смены дискеты

my111: mov ah,0
int 13h
call openfile

mov ptrlo,0
mov ptrhi,0
call SetPointer

mov i,0
r2:
mov j,0
r1:
call ReadData
jmp norst
rst:
mov ah,0
int 13h
norst:
mov ah,3
mov al,18
; xor cx,cx
; mov cl,j
; shl cx,6
; or cl,1
mov ch,j
mov cl,1
mov dh,i
mov dl,0
lea bx,buf
int 13h
jnc n1
inc n
mov bl,n
cmp bl,3
jb rst
jnb therend

n1: mov ptrhi,0
mov ax,BlockSize
mov ptrlo,ax
Call SetPointer
mov n,0
inc j
mov al,j
cmp al,79
jna r1

inc i
mov al,i
cmp al,1
jna r2

;записали все на дискету
jmp theend
therend:
mov ah,09h
mov dx,offset errmsg
int 21h

theend:
mov ax, 4c00h
int 21h
end start


 
Игорь Шевченко ©   (2004-10-20 13:48) [13]


> Я не знаю, по какому принципу она должна работать, чтобы
> уметь считывать неповрежденные части поврежденных файлов.
> Каким должен быть алгоритм работы такой программы?


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

Вот только непонятно, нафига такая программа нужна ?


 
Sam Stone ©   (2004-10-20 13:55) [14]


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

Забивать нулями непрочитанное. Так BadCopy делает.

> уметь считывать неповрежденные части поврежденных файлов.
>

и что ты с ними будешь делать? Ты даже не поймешь, файл это или старая инфа.


 
GanibalLector ©   (2004-10-20 21:09) [15]

2 VMcL ©  [7]

Remarks
Windows Me/98/95:  For volumes that are larger than 2 GB...


Пардон конечно,но ГДЕ вы взяли такой Remarks??? У меня D5 и Remarks не такой,млин...


 
VMcL ©   (2004-10-21 07:37) [16]

>>GanibalLector ©  (20.10.04 21:09) [15]

>У меня D5 и Remarks не такой,млин...

А у меня MSDN 2004 и Remarks именно такой.
:-)



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

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

Наверх




Память: 0.52 MB
Время: 0.027 c
4-1096706334
Antonmm2
2004-10-02 12:38
2004.11.07
Функция для определения DVD-ROMа


6-1093713135
RoLeX2004
2004-08-28 21:12
2004.11.07
Ошибка при отправке e-mail!


1-1098360428
AlexG
2004-10-21 16:07
2004.11.07
Как мне спрятать свойство?


3-1097220207
anat
2004-10-08 11:23
2004.11.07
ODAC-TOraLoader


9-1089528478
ПсихЪ_копия
2004-07-11 10:47
2004.11.07
Движение объектов в OpenGL или как замерять время