Поиск файлов на диске по шаблону по всем каталогам диска. Вывод размера, даты создания и полного пути к найденным файлам

 

Московский Энергетический Институт

Институт автоматики и вычислительной техники

Кафедра ВМСС












Курсовая работа по дисциплине

«Системное программное обеспечение»

Тема: Поиск файлов на диске по шаблону по всем каталогам диска. Вывод размера, даты создания и полного пути к найденным файлам



Студент: Резвая Галина









Москва 2010

Содержание


Введение

. Анализ задания

. Интерфейс программы

. Выбор формата представления данных

. Список процедур, их назначение

. Список функций, используемых в программе

. Тестирование и отладка

Заключение

Список литературы

Приложение А. Листинг программы


Введение


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


.Анализ задания

программа поиск интерфейс

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


.Интерфейс программы


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


.Выбор формата представления данных


Из директив, определяющих элементы данных в программе используются директивы DB и DW(директивы, определяющие байт и два байта соответственно). В табл.1 перечислены переменные, используемые в программе.


Таблица 1

disk_enter_textdbстрока - введите диск для поискаenter_textdbстрока - введите шаблон для поискаcreate_textdbстрока - вывод - дата и времяsize_textdbстрока - размер файлаsumm_textdbстрока - всего результатовdisk_textdbстрока для последующего ввода в нее буквы дискаcur_textdbтекущий каталогroot_textdbкорневой каталогanydbшаблон любого файла или каталогаparentdbродительский каталогcountdbсчетчик найденных файловsearch_templatedbшаблон поискаstruct_locatedwначальный путь для записи промежуточных результатовpath_locatedwполный путь к файлуend_textdbпереход на след строкуsize_bufdwбуфер для хранения размера

4.Список процедур, их назначение


В табл.2 представлены процедуры и их назначение


Таблица 2

outputlпроцедура вывода строки. Перед вызовом процедуры в регистре dx должен храниться адрес на строку, предназначенную для вывода.outputsпроцедура вывода символа. Перед вызовом процедуры в регистре bl должен храниться адрес на символ, предназначенный для вывода.creation_dtimeпроцедура вывода времени, даты. Перед вызовом процедуры в регистрах dx, cx должны храниться дата и время соответственно в DOS-формате.dec_outputпроцедура вывода числа на экран в десятичной форме. Перед вызовом процедуры в регистре ax должно находится число, которое необходимо перевести в десятичный формат и вывести на экран.size_outputпроцедура вывода размера файла. Перед вызовом процедуры по смещению si должна храниться старшая часть, по смещению si+2 младшая часть выводимого размера. Так как она имеет длину два слова.path_outputполучение и вывод на экран полного пути к файлуsearchпроцедура поиска в каталоге файла по ранее заданному шаблону5.Список функций, используемых в программе


Функция 09h прерывания 21h. Вывод строки на экран.

Вход: DS:DX - адрес ASCII-строки символов,

заканчивающийся '$'

Выход: ничего

Функция 02h прерывания 21h. Вывод одиночного символа на экран.

Вход: DL - символ, который необходимо вывести.

Выход: ничего

Функция 7160h прерывания 21h. Получение полного пути к файлу.

Вход: CL = 2. Получить полный путь с длинными именами.

СН = 0. Получить полный путь:SI - адрес ASCIIZ-строки с именем файла или каталога, для которых необходимо получить путь в длинной форме:DI - адрес строки, в которую необходимо записать полный путь

Выход: CF = 0 - успешное выполнение функции, в результате чего полный путь от корневого каталога в виде ASCIZ-строки записывается в буфер, адрес которого указан в ES:DI.

CF = 1 - АХ = код ошибки

Функция 714Eh прерывания 21h. Поиск первого файла.

Вход: CL - атрибуты искомых файлов:DX - адрес ASCIIZ-строки с именем искомого файла или каталога

ES:DI - адрес, куда будет возвращена информация о файле

SI - формат, в котором возвращается дата и время (0-64р)

Выход: CF = 0 - успешное выполнение функции, АХ = дескриптор, использующийся далее для процесса поиска.= 1 - АХ = код ошибки при неудачном выполнении функции.

Функция 71A7h прерывания 21h. Преобразование времени в DOS-формат.Вход: BL = 0 - преобразовать 64-разрядное время в DOS-время .:SI - указатель на структуру, содержащую время.

Выход: CF = 0 - успешное выполнение функции.

CX - время в упакованном формате.

DX - дата в упакованном формате.= 1: АХ - код ошибки.

Функция 714Fh прерывания 21h. Поиск следующего файла.

Вход: ВХ = дескриптор, полученный функцией 714Eh:DI - адрес куда будет возвращена информация о файле

SI - формат, в котором возвращается дата и время (0-64р)

Выход: CF = 0 - успешное выполнение функции, АХ = дескриптор, использующийся далее для процесса поиска.= 1 - АХ = код ошибки при неудачном выполнении функции.

Функция 713Bh прерывания 21h. Смена текущего каталога.

Вход: DS:DX - указатель на буфер, содержащий полный путь от корневого каталога в виде ASCIZ-строки и в качестве последнего элемента включающий имя нового текущего каталога

Выход: CF = 0 - АХ - не определен; =0 - АХ = код ошибки: 03h - путь не найден

Функция 71A1h прерывания 21h. Завершение поискового процесса.

Вход: BX = идентификатор процесса, который необходимо завершить

Выход: CF = 0, если операция выполнена
CF = 1 и АХ = код ошибки
Функция 01h прерывания 21h. Чтение одиночного символа с клавиатуры.

Вход: ничего

Выход: AL = ASCII-код символа или 0

Функция 0Ah прерывания 21h. Чтение строки с клавиатуры.

Вход: DS:DX - адрес буфера, первый байт которого должен содержать максимальное количество символов для ввода

Выход: введенная строка начиная с третьего байта буфера по адресу в DS:DX, длина строки во втором байте буфера.

Функция 4ch прерывания 21h. Завершение программы.

Вход:AL = код завершения.

Выход: ничего


.Тестирование и отладка


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


Заключение


Поставленная задача была реализована. Особые трудности вызвала отладка программы.


Список литературы


1.П. Абель Язык ассемблера для IBM PC и программирования - М.: Высшая школа, 1992. -447с.

.Файл руководства по системным функциям - interrup.lst.

.Интернет ресурсы: #"justify">Приложение А. Листинг программы


; Поиск файлов на диске по шаблону по всем каталогам диска.

; Вывод размера, даты создания и полного пути к найденным файлам.

;_______________________________________________________________

.model small

.stack 200h

;_______________________________________________________________

.data_template db 14,0,13 dup (?),0 ; шаблон поиска, мб сделать label

any db '*',0; шаблон любого файла или

;каталогаdb '..',0; родительский каталогdb 0; счетчик найденных файлов_locate dw 00A0h; начальный путь для записи пром.

;результатов

path_locate dw 0100h ; полный путь к файлу_text db 'Creation date and time: $'; строка - вывод - дата и время_text db 'Size: $'; строка - размер файла_text db 0dh,0ah,'$'; переход на след строку_text db 'Summary: $'; всего результатов

enter_text db 'enter pattern for search: $'; строка - введите шаблон для

;поиска_enter_text db 'enter disk for search: $'; строка - введите диск для поиска

disk_text db 'C:',0; строка для послед ввода в нее

;буквы диска_text db '.',0 ; текущий каталог_text db '\',0 ; корневой каталог _buf dw 2 dup (?) ; буфер для хранения размера файла

;_________________________________________________________________

.codeproc; процедура вывода строки

mov ah,09h

int 21h

ret

endp outputl

proc; процедура вывода на экран одиночного символа

push dx

mov ah,02h

mov dl,bl

int 21h

pop dx

retoutputs


creation_dtime proc; процедура вывода времени, даты

; dx - |Y|Y|Y|Y|Y|Y|Y|M|M|M|M|D|D|D|D|D|

mov al,dl; день

and al,00011111b; накладываем маску на соответствующие

;разряды

mov ah,0

call dec_output; выводим на экран в десятичной форме


mov bl,'/'; разделяющий символ, для удобства

call outputs


mov ax,dx; месяц

shr ax,5

and al,00001111b

mov ah,0

call dec_output


call outputs; разделяющий символ, для удобства


mov al,dh; год

and al,11111110b

shr al,1

mov ah,0

add ax,07BCh

call dec_output


mov bl,' '; разделяющий символ, для удобства

call outputs

; сx - |H|H|H|H|H|M|M|M|M|M|M|S|S|S|S|S|

mov al,ch; час

and al,11111000b

shr al,3

mov ah,0

call dec_output


mov bl,':'; разделяющий символ, для удобства

call outputs


mov ax,cx; минуты

shr ax,5

and al,00111111b

mov ah,0

call dec_output


call outputs; разделяющий символ, для удобства


mov al,cl; секунды

and al,00011111b

mov ch,2

mul ch

call dec_output


retcreation_dtime

_output proc; процедура вывода числа на экран в десятичной форме

push cx

push bx

push dx

mov cx,0


conversion:

mov bl,1010b; для перевода из двоичной системы в десятичную

div bl; делим число на основание новой системы счисления

push ax; остаток сохраняем в стеке

inc cx

mov ah,0

cmp al,0

jne conversion; делим до тех пор, пока делимое не станет =0

output:

pop ax; выводим остатки от деления в обратном порядке

mov dl,ah

mov ah,02h

cmp dl,9

jg hex_alpha

add dl,48

jmp out_end

hex_alpha:

add dl,55

out_end:

int 21h

loop output

pop dx

pop bx

pop cx

retdec_output


size_output proc; процедура вывода размера файла

push ax; размер файла имеет длину два слова, старшая

;хранится по смещению si, младшая - si+2

push bx

push cx

push dx

mov cx,0

mov bx,10; переводим размер из двоичной в десятичную

;систему счисления

hex2dec:

mov dx,0; т.к. результат деления может превышать размер

;слова, используем алгоритм деления по словам

mov ax,[si]; делим старшее слово

div bx

mov [si],ax

mov ax,[si+2]; производим деление младшего слова с учетом

;остатка от деления старшего слова (rest)

div bx; rest*2^16 + младшее_слово / bx

mov [si+2],ax

push dx

add ax,[si]

inc cx

cmp word ptr [si],0

jne hex2dec

cmp word ptr [si+2],0

jne hex2dec

out_put:

pop ax

mov dl,al

mov ah,02h

cmp dl,9

jg hexalpha

add dl,48

jmp outend

hexalpha:

add dl,55

outend:

int 21h

loop out_put

pop dx

pop cx

pop bx

pop ax

retsize_output


path_output proc; получение и вывод на экран полного пути к файлу

push ax

push cx

push si

push di

push bx

push dx

pushf; размещение регистра флагов в стеке

mov ax,7160h; получение полного пути к файлу

mov cx,2; получение полного пути с длинными именами

lea si,cur_text; DS:SI - адрес ASCIIZ-строки с именем файла

;или каталога, для которых необходимо ;получить путь в длинной форме 21h; ES:DI - адрес строки, в которую необходимо ;записать полный путь

p_output:

mov bl,ds:[di]; вывод полного пути к файлу на экран

call outputs

inc di

cmp bl,0

jne p_output

lea dx,end_text

call outputl

popf

pop dx

pop bx

pop di

pop si

pop cx

pop ax

retpath_output

;========================================================= search proc; процедура поиска в каталоге

mov ax, 714Eh; функция поиска первого файла

mov cx, 0FFh; с атрибутами: архивный, подкаталог,

;системный, спрятанный, только чтение

mov di, bp; на начальный путь записи пром. результатов

mov si,0; время в 64разрядном формате

mov dx,offset search_template+2

; шаблон поиска, минус 2байта |Max|Real|

int 21h

jnc cf_search; если ничего не найдено, ищем подкаталоги для

;дальнейшего поиска

jmp far ptr directory_search


cf_search:

mov bx,ax; в в ax записывается порядк номер процесса поиска


file_search:

push bx; сохраним значение регистров в стеке

push di

push dx

push si


lea di,count; подсчет количества результатов

mov dl,[di]

inc dl

mov [di],dl


mov ax, 7160h; получим полный путь к файлу

mov cl, 2; получить путь с длинными именами

mov cx, 0; получить полный путь(а не имя диска, если 80)

lea si, [bp+2Ch]; формируем указатель на имя файла DS:SI

lea di,path_locate; номинируем указатель на буфер, для получения

int 21h;полного пути


pout:; вывод полного пути к файлу на экран

mov bl,[di]

call outputs


inc di; выводим пока не дойдем до признака конца строки

cmp bl,0

jne pout


lea dx,end_text; переход на след строку

call outputl


lea dx,create_text; вывод на экран "data, time: "

call outputl


mov ax,71A7h; преобразование времени в DOS-формат

mov bl,0; dх получит дату, сх - время

lea si,[bp+4]; указатель на структуру, содержащую время

int 21h


call creation_dtime; вызов процедуры вывода даты и времени


lea dx,end_text; переход на след строку

call outputl


lea dx,size_text; вывод на экран "size: "

call outputl


mov ax,7143h; получим атрибуты файла

mov bx,2; 2 - получим размер "сжатого файла"

lea dx,[bp+2Ch]; DS:DX - ASCIIZ-строка с именем файла

int 21h

lea si,size_buf

mov [si],dx; заносим размер файла в буфер

mov [si+2],ax

call size_output; выводим на экран


lea dx,end_text; переход на след строку

call outputl

lea dx,end_text

call outputl


pop si; восстановим значение регистров

pop dx

pop di

pop bx


mov ax, 714Fh; функция поиска следующего файла по шабл.

int 21h; BX - номер процесса поиска, возвр-ся фун-ей

jnc file_search

_search:

mov ax,714Eh; функция поиска первого подкаталога

mov di,bp; ES:DI - адрес, куда будет возвращена

;информация о файле

mov cx,1010h; выводить только каталоги

mov si,0; формат, в котором возвращается дата и время

lea dx,any; DS:DX - адрес ASCIIZ-строки с именем искомого

;файла или каталога

int 21h

mov bx,ax


push cx; для того, чтобы не обрабатывать ссылки на текущий

;и родительский

mov cl,ds:[bp+2Ch]; каталог ('.' и '..'), прогоняем поиск два раза

cmp cl,2Eh; если имя каталога начинается не с '.'

;(находимся в корне диска), сразу переходим в этот каталог

pop cx

jne directory_jump


mov ax,714Fh; найти следующий подкаталог

int 21h

_directory:

mov ax,714Fh; поиск подкаталога

int 21h

jc search_fin; если больше подкаталогов нет, завершаем поиск

directory_jump:

push bx

push si

push di

push dx

mov ax,713Bh; смена текущего каталога, в DS:DX - адрес на

;ASCIIZ-строку с полным путем к новому каталогу

lea dx,[bp+2Ch]; новый каталог является подкаталогом текущего =>

;полный путь можно опустить

int 21h


call search; запускаем новый поиск в найденном подкаталоге

mov ax,713Bh; переход в родительский каталог после поиска

mov dx,offset parent

int 21h

pop dx

pop di

pop si

pop bx

jmp next_directory_fin:

mov ax,71A1h; завершение поискового процесса, указанного в BX

int 21h

retsearch

;_____________________________________________________

main:

mov ax,@data; инициализация сегментов

mov ds,ax

mov es,ax


lea dx,disk_enter_text; вывод на экран "enter disk for search:"

call outputl


mov ah,01h; запись в al, считанного символа

int 21h


lea bx,disk_text

mov [bx],al; запись букву диска в disk_text

lea dx,end_text; переход на след строку

call outputl


mov ax,713Bh; переход в корневой каталог указанного диска

lea dx,disk_text; смена текущего каталога, DS:DX - путь к новому

;каталогу (ASCIIZ - строка)

int 21h

mov ax,713Bh

lea dx,root_text

int 21h


lea dx,enter_text; на начальный путь записи пром. результатов

call outputl


mov ah,0Ah; ввод поискового шаблона с клавиатуры

lea dx,search_template; 0Ah - ввод строки с клавиатуры, результат

;записывается в DS:DX, начиная со смещения DX+2

int 21h; по смещению DX предварительно помещается

;максимальная

; длина вводимой строки, DX+1 - количество ;считанных символов

mov bx,dx; ставим в конец строки с введенным поисковым

;шаблоном нулевой символ

; (преобразование к ASCIIZ-строке, для

;совместимости с функциями 71xx)

mov dl,[bx+1]; записываем в dl количество символов,

;считанных с клавиатуры

mov dh,0

mov di,dx

lea bx,[di+2]; смещаемся в конец считанной строки с шаблоном

mov byte ptr[bx],0; и записываем нулевой символ


lea dx,end_text

call outputl


lea bp,struct_locate; помещаем в bp указатель на начало

;"поисковой структуры"

mov bp,[bp]


call search


mov ah,09h

lea dx,summ_text; вывод на экран "Summary: "

int 21h


lea si,count; вывод на экран количества найденных файлов

mov al,[si]

mov ah,0

call dec_output


mov ah,4Ch; стандартное завершение программы

int 21hmain



Московский Энергетический Институт Институт автоматики и вычислительной техники Кафедра ВМСС Курсовая работ

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ