Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

поиск файлов по строке

9.9K
12 апреля 2005 года
chelovek
7 / / 10.04.2005
Все здравствуйте!
Задали мне такой курсовик: вводится строка и надо найти все файлы на всех дисках, или можно указать диск, содержащие эту строку, вывести их имена с путями.
Знаю что по сути курсовик не сложный, но много я непонимаю, если кто может помочь, может
объяснить... очень прошу, так как хочу разобраться.
243
12 апреля 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by chelovek
Все здравствуйте!
Задали мне такой курсовик: вводится строка и надо найти все файлы на всех дисках, или можно указать диск, содержащие эту строку, вывести их имена с путями.
Знаю что по сути курсовик не сложный, но много я непонимаю, если кто может помочь, может
объяснить... очень прошу, так как хочу разобраться.


Хм... Исчерпывающие исходные данные для ответа на ваш вопрос. А на чем программить-то? И если вы ничего не знаете, то с чего начинать объяснять? Не с элементраных конструкций же...

В общем алгоритм следующий (в моем понимании - ясно, что у других людей все может оказаться по другому):

Код:
1. Устанавливаем рабочей директорией заданный диск: SetCurrentDirectory(...).
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). Параметры функций - думаю в инете найти не сложно, главное знать, что искать.
ЗЫ А курсовик действительно на один день.
9.9K
12 апреля 2005 года
chelovek
7 / / 10.04.2005
[QUOTE]Originally posted by pacific_7
Хм... А на чем программить-то?

в какой среде? раз топик в разделе низкоуровневого программирования, то в асме конечно. =)
8.3K
12 апреля 2005 года
_edge [tkm]
48 / / 04.04.2005
если 16bit asm под msdos, все совсем просто :).

консольный ввод с клавиатуры, далее простой
разбор строки на предмет path + mask, далее
смена каталога на path через changedir, далее
ffirst/fnext. все через int 21.
243
12 апреля 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by chelovek
раз топик в разделе низкоуровневого программирования, то в асме конечно. =)


Во первых: язык ассемблера это не среда разработки.
Во вторых: ветка "Низкоуровневое программирование", а не "Программирование на языке ассемблера". А это знаете ли не одно и то же.
К низкоуровневому программированию относят как программирование работающее с машинными командами (практически это асм), так и программирование работающее на низком уровне с данными - побитово, с возможностью адресовать каждый бит, или программирование работающее с аппаратными ресурсами компьютера (порты вв/выв., диски, и им подобное). Таким образом сюда относится и простой С (без приблуд в виде "++", или "#") - во многих случаях он не только не хуже, а даже лучше асма, иногда даже по оптимальности написанных программ. Ну и последнее - асм можно использовать практически где угодно - VC++, Builder, Delphi. За васик говорить не берусь - никогда на нем не работал.
ЗЫ. Все равно, если программить на асме под винды, то придется использовать вышеприведенные API функции, но только в контексте асма.
ИМХО: подобные задания просто грешно писать на асме - стрельба из гранатомета по мухам. Будет долго и бесполезно. Я конечно понимаю, что это не ваша идея, но все же асм лучше использовать только там, где без него нельзя обойтись...

391
12 апреля 2005 года
Archie
562 / / 03.02.2005
[QUOTE]Originally posted by pacific_7
 
Код:
...
        2.4 Считываем в строковый буфер первую порцию данных: ReadFile(...), производим в ней поиск lstrstr(...)
        2.5 Если надена нужная строка, то выводим имя текущего каталога + имя открытого файла.
        Иначе продолжаем поиск в файле пока не достигнем его конца.
        ...

[QUOTE]
Тут еще нужно блюсти один момент, когда строка попадает на границу раздела двух буферов. Т.е. следующий буфер нужно считывать, перекрывая предыдущий на (длину строки - 1).
243
12 апреля 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Archie

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


И то верно, недоглядел, хотя нужно же дать человеку самому головой подумать ;).

9.9K
12 апреля 2005 года
chelovek
7 / / 10.04.2005
использую tasm, наверно будет проще кинуть части кода в которых непонятки, и спросить у вас разъяснений, уважаемые люди. =)
8.3K
13 апреля 2005 года
_edge [tkm]
48 / / 04.04.2005
самое сложное -ввести с клавы строку, принимая
во внимание особенности операционки и особенности
человека, который будет это непосредственно
вводить :).

с операционкой проще -если мне память не изменяет,
нужно обратить внимание на ctrl+c и на то,
добавляет ли она по завершении ввода 0x0d,0x0a
(crlf, перевод каретки). также расчитать размер
буфера ввода данных.

с человеком сложнее. одна учительница по
предмету информатики очень любила бетатестинг :).
если программа ждет ввода числовых значений,
злая тетка намерянно вводила буквицы и смотрела
как на это среагирует код. но это лирика :).
9.9K
14 апреля 2005 года
chelovek
7 / / 10.04.2005
Здравствуйте уважаемые люди!
итак непонятк. Вот код:
.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 ?
8.3K
15 апреля 2005 года
_edge [tkm]
48 / / 04.04.2005
функция 09, print string работает таким образом,
что печатает до знака доллара. если оного в конце
строки нет, она, как паравоз без управления идет
печатать дальше, глотая все подряд (включая 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 идут
нулевые байты. вспомнил :].
9.9K
15 апреля 2005 года
chelovek
7 / / 10.04.2005
спасибо добрый человек!
действительно работает!
а как быть с последними двумя вопорсами?
2) надо чтоб выводился еще и путь по которому находится файл, вроде есть функция
47h - определение текущего каталога, вот тока как ею правильно пользоваться,
описание входов выходов и ошибок у меня есть (Зубков в электронном виде)
но не доходит до меня как эту функцию правильно применить.
3) можно ли указываться в маске для поиска несколько расширений, т.е.
что нить вроде file db '*.txt','*.doc',0 ?

разъясни пжалуста.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог