Консультация № 159688
05.02.2009, 16:50
0.00 руб.
0 11 1
здравствуйте эксперты!!!напишите пожалуйста программу для поиска файлов(желательно всех расширений,если нет,то TXT документов).за ранее благодарен!!

Обсуждение

Неизвестный
05.02.2009, 20:20
общий
А текущем каталоге, в задаваемом ... ? Всех-то на современном компьютере ох как много ...
давно
Старший Модератор
31795
6196
05.02.2009, 21:57
общий
А Вам, DOS или Windows?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
06.02.2009, 00:54
общий
И если под ДОС, то работаем с короткими именами или с длинными?
Искать по всему диску? По всем подкаталогам заданного каталога?
Как задавать начальный путь поиска и маску файлов? Задать в тексте программы, вводить в командной строке, запросить с клавиатуры...
Видите, сколько неопределенностей в вашем вопросе.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
09.02.2009, 14:07
общий
в задаваемом каталоге,нужна программка под windows,задать в тексте программы!!!спасибо что уточнили!!!
Неизвестный
09.02.2009, 14:15
общий
Да не совсем: в чем писать-то? TASM, MASM32, MASM611, ...
давно
Посетитель
7438
7205
09.02.2009, 14:34
общий
это ответ
Здравствуйте, Ska89!
Держите программу под masm32.
По умолчанию, если ничего не задано параметром, ищет все файлы в текущей папке по маске *.txt
Можно задать параметром любой путь с маской.
Чтобы откомпилировать, необходимо создать BAT-файл следующего содержания:
Код:
@echo off
:n - имя файла программы
set n=mdir
if exist %n%.obj del %n%.obj
if exist %n%.exe del %n%.exe

: -----------------------------------------
: assemble %n%.asm into an OBJ file
: -----------------------------------------
\MASM32\BIN\Ml.exe /c /coff /Fl %n%.asm
if errorlevel 1 goto errasm

: --------------------------------------------------
: link the main OBJ file with the resource OBJ file
: --------------------------------------------------
\MASM32\BIN\Link.exe /SUBSYSTEM:CONSOLE %n%.obj
if errorlevel 1 goto errlink

dir %n%.*

goto TheEnd

:errlink
: ----------------------------------------------------
: display message if there is an error during linking
: ----------------------------------------------------
echo.
echo There has been an error while linking this project.
echo.
goto TheEnd

:errasm
: -----------------------------------------------------
: display message if there is an error during assembly
: -----------------------------------------------------
echo.
echo There has been an error while assembling this project.
echo.

:TheEnd
pause

PS Код не мой, слегка подправлен код из примеров masm-а (Зачем изобретать велосипед?)

Приложение:
.386
.model flat, stdcall
option casemap :none ; case sensitive

; #########################################################################

include \masm32\include\windows.inc

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib

Main PROTO

; #########################################################################

.data
lf db 13,10,0
wCard db "*.txt",0
notfound db "File not found",13,10,0
spc db " ",0
bytes db " bytes",0
fMtStrinG db "%lu",0


; #########################################################################

.code

start:
invoke Main
invoke ExitProcess,0

; #########################################################################

Main proc

LOCAL hSearch :DWORD ; search handle
LOCAL sizeBuffer[16]:BYTE
LOCAL fBuffer[256]:BYTE ; file name buffer
LOCAL clBuffer[128]:BYTE ; command line buffer
LOCAL wfd :WIN32_FIND_DATA

invoke GetCL,1,ADDR clBuffer ; get arg 1
.if eax != 1 ; if no arg
mov ecx, LENGTHOF wCard ; copy *.txt into
mov esi, offset wCard ; clBuffer
lea edi, clBuffer
rep movsb
.endif

invoke FindFirstFile,ADDR clBuffer,ADDR wfd
.if eax == INVALID_HANDLE_VALUE
invoke StdOut,ADDR notfound ; display "not found" message
jmp TheEnd
.else
mov hSearch, eax
.endif
invoke StdOut,ADDR wfd.cFileName
mov al, [wfd.cFileName]
cmp al, "."
je nxt
invoke StdOut,ADDR spc
invoke wsprintf,ADDR sizeBuffer,ADDR fMtStrinG,wfd.nFileSizeLow
invoke StdOut,ADDR sizeBuffer
invoke StdOut,ADDR bytes
nxt:
invoke StdOut,ADDR lf
@@:
invoke FindNextFile,hSearch,ADDR wfd
cmp eax, 0
je lpOut
invoke StdOut,ADDR wfd.cFileName
mov al, [wfd.cFileName]
cmp al, "."
je nxt1
invoke StdOut,ADDR spc
invoke wsprintf,ADDR sizeBuffer,ADDR fMtStrinG,wfd.nFileSizeLow
invoke StdOut,ADDR sizeBuffer
invoke StdOut,ADDR bytes
nxt1:
invoke StdOut,ADDR lf
jmp @B

lpOut:
invoke FindClose,hSearch

TheEnd:

ret

Main endp

; #########################################################################

end start
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
09.02.2009, 14:42
общий
Boriss:
нужна программка под windows

Выбор уже меньше: tasm32 или masm32
Разные там fasm, wasm не рассматриваем
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
09.02.2009, 17:28
общий
а можно в fasmw?или никак???:
давно
Посетитель
7438
7205
10.02.2009, 13:51
общий
Почему никак? Можно и в fasmw... Как скажете...:)
Пришлось добавить подпрограмму получения параметра командной строки.
В Masm-е она стандартная...Это одна из причин, почему лично я предпочитаю masm.

Код:
	format	PE console
entry start

include 'win32a.inc'

; #########################################################################
section '.data' readable writable
lf db 13,10,0
wCard db "*.txt",0
wCald.len = $ - wCard
notfound db "File not found",13,10,0
spc db " ",0
bytes db " bytes",0
fMtStrinG db "%lu",0

section '.bss' readable writable
hSearch dd ? ; search handle
sizeBuffer db 16 dup(?)
fBuffer db 256 dup (?) ; file name buffer
clBuffer db 128 dup (?) ; command line buffer
wfd WIN32_FIND_DATA <>

; #########################################################################
section '.code' code readable executable

start:
stdcall GetCL, 1, clBuffer ; get arg 1
cmp eax, 1
je @@13 ; if no arg
mov ecx, wCald.len ; copy *.txt into
mov esi, wCard ; clBuffer
mov edi, clBuffer
rep movsb
@@13:
invoke FindFirstFileA,clBuffer,wfd
cmp eax, INVALID_HANDLE_VALUE
jne @@14
cinvoke printf, notfound ; display "not found" message
jmp TheEnd
@@14:
mov [hSearch], eax
@@loop:
cinvoke printf, wfd.cFileName
mov al, [wfd.cFileName]
cmp al, "."
je nxt
cinvoke printf, spc
invoke printf, fMtStrinG, [wfd.nFileSizeLow]
invoke printf, bytes
nxt:
invoke printf, lf
@@next:
invoke FindNextFileA,[hSearch], wfd
cmp eax, 0
jne @@loop

invoke FindClose, [hSearch]

TheEnd:
invoke exit,0

; #########################################################################

proc GetCL uses esi edi, ArgNum:DWORD, ItemBuffer:DWORD

; -------------------------------------------------
; arguments returned in "ItemBuffer"
;
; arg 0 = program name
; arg 1 = 1st arg
; arg 2 = 2nd arg etc....
; -------------------------------------------------
; Return values in eax
;
; 1 = successful operation
; 2 = no argument exists at specified arg number
; 3 = non matching quotation marks
; 4 = empty quotation marks
; -------------------------------------------------

local lpCmdLine :DWORD
local cmdBuffer[192] :BYTE
local tmpBuffer[192] :BYTE

invoke GetCommandLineA
mov [lpCmdLine], eax ; address command line
; -------------------------------------------------
; count quotation marks to see if pairs are matched
; -------------------------------------------------
xor ecx, ecx ; zero ecx & use as counter
mov esi, [lpCmdLine]

@@1:
lodsb
cmp al, 0
je @@2
cmp al, 34 ; [ " ] character
jne @@1
inc ecx ; increment counter
jmp @@1
@@2:

push ecx ; save count

shr ecx, 1 ; integer divide ecx by 2
shl ecx, 1 ; multiply ecx by 2 to get dividend

pop eax ; put count in eax
cmp eax, ecx ; check if they are the same
je @@12
mov eax, 3 ; return 3 in eax = non matching quotation marks
ret
@@12:

; ------------------------
; replace tabs with spaces
; ------------------------
mov esi, [lpCmdLine]
lea edi, [cmdBuffer]

@@3:
lodsb
cmp al, 0
je rtOut
cmp al, 9 ; tab
jne rtIn
mov al, 32
rtIn:
stosb
jmp @@3
rtOut:
stosb ; write last byte

; -----------------------------------------------------------
; substitute spaces in quoted text with replacement character
; -----------------------------------------------------------
lea eax, [cmdBuffer]
mov esi, eax
mov edi, eax

subSt:
lodsb
cmp al, 0
jne @@4
jmp subOut
@@4:
cmp al, 34
jne subNxt
stosb
jmp subSl ; goto subloop
subNxt:
stosb
jmp subSt

subSl:
lodsb
cmp al, 32 ; space
jne @@5
mov al, 254 ; substitute character
@@5:
cmp al, 34
jne @@6
stosb
jmp subSt
@@6:
stosb
jmp subSl

subOut:
stosb ; write last byte

; ----------------------------------------------------
; the following code determines the correct arg number
; and writes the arg into the destination buffer
; ----------------------------------------------------
lea eax, [cmdBuffer]
mov esi, eax
lea edi, [tmpBuffer]

mov ecx, 0 ; use ecx as counter

; ---------------------------
; strip leading spaces if any
; ---------------------------
@@7:
lodsb
cmp al, 32
je @@7

l2St:
cmp ecx, [ArgNum] ; the number of the required cmdline arg
je clSubLp2
lodsb
cmp al, 0
je cl2Out
cmp al, 32
jne cl2Ovr ; if not space

@@8:
lodsb
cmp al, 32 ; catch consecutive spaces
je @@8

inc ecx ; increment arg count
cmp al, 0
je cl2Out

cl2Ovr:
jmp l2St

clSubLp2:
stosb
@@9:
lodsb
cmp al, 32
je cl2Out
cmp al, 0
je cl2Out
stosb
jmp @@9

cl2Out:
mov al, 0
stosb

; ------------------------------
; exit if arg number not reached
; ------------------------------
cmp ecx, [ArgNum]
jae @@17
mov edi, [ItemBuffer]
mov al, 0
stosb
mov eax, 2 ; return value of 2 means arg did not exist
ret
@@17:

; -------------------------------------------------------------
; remove quotation marks and replace the substitution character
; -------------------------------------------------------------
lea eax, [tmpBuffer]
mov esi, eax
mov edi, [ItemBuffer]

rqStart:
lodsb
cmp al, 0
je rqOut
cmp al, 34 ; dont write [ " ] mark
je rqStart
cmp al, 254
jne @@10
mov al, 32 ; substitute space
@@10:
stosb
jmp rqStart

rqOut:
stosb ; write zero terminator

; ------------------
; handle empty quote
; ------------------
mov esi, [ItemBuffer]
lodsb
cmp al, 0
jne @@11
mov eax, 4 ; return value for empty quote
ret
@@11:

mov eax, 1 ; return value success
ret
endp

; #########################################################################

section '.idata' data import readable writable
library msvcrt,'msvcrt.dll',\
kernel32,'kernel32.dll'

import msvcrt,\
printf,'printf',\
sprintf,'sprintf',\
exit,'exit'

import kernel32,\
FindFirstFileA,'FindFirstFileA',\
FindNextFileA,'FindNextFileA',\
FindClose,'FindClose',\
GetCommandLineA,'GetCommandLineA'
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.02.2009, 18:00
общий
а мне вот наоборот в fasmw надо работать!!!спасибо за код программки!!!!
давно
Старший Модератор
31795
6196
10.02.2009, 18:08
общий

На будущее указывайте компилятор, а то Игорь Витальевич мог Вам написать и на CompModel.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа