поиск файлов по строке
Задали мне такой курсовик: вводится строка и надо найти все файлы на всех дисках, или можно указать диск, содержащие эту строку, вывести их имена с путями.
Знаю что по сути курсовик не сложный, но много я непонимаю, если кто может помочь, может
объяснить... очень прошу, так как хочу разобраться.
Все здравствуйте!
Задали мне такой курсовик: вводится строка и надо найти все файлы на всех дисках, или можно указать диск, содержащие эту строку, вывести их имена с путями.
Знаю что по сути курсовик не сложный, но много я непонимаю, если кто может помочь, может
объяснить... очень прошу, так как хочу разобраться.
Хм... Исчерпывающие исходные данные для ответа на ваш вопрос. А на чем программить-то? И если вы ничего не знаете, то с чего начинать объяснять? Не с элементраных конструкций же...
В общем алгоритм следующий (в моем понимании - ясно, что у других людей все может оказаться по другому):
2. Производим поиск: FindFirstFile(...)/FindNextFile(...) по маске "*":
2.1 Попался каталог - вызываем функцию поиска, но в параметре указываем не текущий каталог, а найденный (рекурсивный вызов).
2.2 Попался файл:
2.2 Открываем его для чтения: CreateFile(...).
2.4 Считываем в строковый буфер первую порцию данных: ReadFile(...), производим в ней поиск lstrstr(...)
2.5 Если надена нужная строка, то выводим имя текущего каталога + имя открытого файла.
Иначе продолжаем поиск в файле пока не достигнем его конца.
2.6 Закрываем файл: CloseHandle(...).
2.7 Возвращаемся к пункту 2.
2.3 Следующий файл не найден - переходим к пункту 3.
3. Закрывае поиск FindClose(...).
И делов. Т.к. не указана среда разработки, то все приведенные в примерах функции взяты из WinAPI, т.е. будут работать в любой среде (если конечно разрабатывать под Win). Параметры функций - думаю в инете найти не сложно, главное знать, что искать.
ЗЫ А курсовик действительно на один день.
Хм... А на чем программить-то?
в какой среде? раз топик в разделе низкоуровневого программирования, то в асме конечно. =)
консольный ввод с клавиатуры, далее простой
разбор строки на предмет path + mask, далее
смена каталога на path через changedir, далее
ffirst/fnext. все через int 21.
раз топик в разделе низкоуровневого программирования, то в асме конечно. =)
Во первых: язык ассемблера это не среда разработки.
Во вторых: ветка "Низкоуровневое программирование", а не "Программирование на языке ассемблера". А это знаете ли не одно и то же.
К низкоуровневому программированию относят как программирование работающее с машинными командами (практически это асм), так и программирование работающее на низком уровне с данными - побитово, с возможностью адресовать каждый бит, или программирование работающее с аппаратными ресурсами компьютера (порты вв/выв., диски, и им подобное). Таким образом сюда относится и простой С (без приблуд в виде "++", или "#") - во многих случаях он не только не хуже, а даже лучше асма, иногда даже по оптимальности написанных программ. Ну и последнее - асм можно использовать практически где угодно - VC++, Builder, Delphi. За васик говорить не берусь - никогда на нем не работал.
ЗЫ. Все равно, если программить на асме под винды, то придется использовать вышеприведенные API функции, но только в контексте асма.
ИМХО: подобные задания просто грешно писать на асме - стрельба из гранатомета по мухам. Будет долго и бесполезно. Я конечно понимаю, что это не ваша идея, но все же асм лучше использовать только там, где без него нельзя обойтись...
2.4 Считываем в строковый буфер первую порцию данных: ReadFile(...), производим в ней поиск lstrstr(...)
2.5 Если надена нужная строка, то выводим имя текущего каталога + имя открытого файла.
Иначе продолжаем поиск в файле пока не достигнем его конца.
...
[QUOTE]
Тут еще нужно блюсти один момент, когда строка попадает на границу раздела двух буферов. Т.е. следующий буфер нужно считывать, перекрывая предыдущий на (длину строки - 1).
Тут еще нужно блюсти один момент, когда строка попадает на границу раздела двух буферов. Т.е. следующий буфер нужно считывать, перекрывая предыдущий на (длину строки - 1).
И то верно, недоглядел, хотя нужно же дать человеку самому головой подумать ;).
во внимание особенности операционки и особенности
человека, который будет это непосредственно
вводить :).
с операционкой проще -если мне память не изменяет,
нужно обратить внимание на ctrl+c и на то,
добавляет ли она по завершении ввода 0x0d,0x0a
(crlf, перевод каретки). также расчитать размер
буфера ввода данных.
с человеком сложнее. одна учительница по
предмету информатики очень любила бетатестинг :).
если программа ждет ввода числовых значений,
злая тетка намерянно вводила буквицы и смотрела
как на это среагирует код. но это лирика :).
итак непонятк. Вот код:
.model tiny
.code
org 100h
start:
mov ah,4eh ; ищем первый файл
mov cx,00100110b ; атрибуты
next:
mov dx,offset file ; адрес маски для поиска
int 21h
jc exit ; чуть что - на выход
mov ah,09h
mov dx,9eh ; имя берём из DTA по смещению 9Eh(т.к. парметры запуска я не
int 21h ; использую, то можно считать DTA и от 80h=))
mov ah,09h
mov dx,offset nl
int 21h
mov ah,4fh ; функция поиска следующего файла
jmp next
exit:
ret
nl db 10,13,'$'
fn db 80,?,80 dup(?)
file db '*.txt',0
end start
1) короче после выполнения выводятся имена файло с расширением, и выводится
еще какая то белиберда, в чем дело?
2) надо чтоб выводился еще и путь по которому находится файл, вроде есть функция
47h - определение текущего каталога, вот тока как ею правильно пользоваться,
описание входов выходов и ошибок у меня есть (Зубков в электронном виде)
но не доходит до меня как эту функцию правильно применить.
3) можно ли указываться в маске для поиска несколько расширений, т.е.
что нить вроде file db '*.txt','*.doc',0 ?
что печатает до знака доллара. если оного в конце
строки нет, она, как паравоз без управления идет
печатать дальше, глотая все подряд (включая ascii
07, beep). повторно вызывать ее со знаком доллара
бесполезно.
далее, выводимые строки будут печататься слитно,
если не поставить принудительный перевод каретки.
в данном случае можно вызывать print string,
подсовывая ей 0dh,0ah,24h.
*вытаскивать имена файлов, я полагаю можно только
посимвольно, зная, что после точки идут три
байта на расширение. мы ведь пишем под msdos :]
model tiny
codeseg
org 0100h
@strt:
mov ah,3ch
sub cx,cx
lea dx,fname
int 21h
mov bx,ax
mov ah,4eh
lea dx,fmask
int 21h
jb @lc00
@lc01:
mov si,009eh
sub cx,cx
push si
@lc02:
lodsb
inc cx
or al,al
jnz @lc02
pop dx
mov ah,40h
int 21h
mov ah,4fh
int 21h
jnb @lc01
@lc00:
retn
fname db "_dir.dt",00h
fmask db "*.com",00h
end @strt
прога выводит в файл. drweb детектирует ее как
вирусок, но реально это проблемы эвристического
сканера, а не моих кривых ручек.
*эмм.. поправка. после имени файла в dta идут
нулевые байты. вспомнил :].
действительно работает!
а как быть с последними двумя вопорсами?
2) надо чтоб выводился еще и путь по которому находится файл, вроде есть функция
47h - определение текущего каталога, вот тока как ею правильно пользоваться,
описание входов выходов и ошибок у меня есть (Зубков в электронном виде)
но не доходит до меня как эту функцию правильно применить.
3) можно ли указываться в маске для поиска несколько расширений, т.е.
что нить вроде file db '*.txt','*.doc',0 ?
разъясни пжалуста.