Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2010, 22:28   #1
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию Как вывести список файлов в текстовый файл

Не подскажете с помощью какой конструкции и связки двух функций
invoke FindFirstFile
invoke FindNextFile
Можно вывести список всех файлов лежащих в какой нибудь папке
и записать этот список в текстовый файл
assch вне форума Ответить с цитированием
Старый 18.12.2010, 18:56   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Вот кусок из какой-то моей игрушки. Здесь в памяти формируется список файлов уровней. Вам только в файл осталось это скинуть.

Код:
wmgetlistlevel:
	invoke	GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MAX_CNTLEVEL * MAX_LENGHTNAMELEV
	mov	[hMemListLev], eax
	invoke	GlobalLock, [hMemListLev]
	mov	[ipMemListLev], eax
;# Ищу файлы уровней
wmgetlistlevel1:
	invoke	FindFirstFile, addr [MaskFileLev], addr [findfileSTR]
	mov	[hFindFile], eax
	cmp	[findfileSTR.dwFileAttributes], FILE_ATTRIBUTE_DIRECTORY
	je	wmgetlistlevel3
	jmp	wmgetlistlevel4
wmgetlistlevel3:
	invoke	FindNextFile, [hFindFile], addr [findfileSTR]
	cmp	eax, 0
	je	wmgetlistlevel2
	cmp	[findfileSTR.dwFileAttributes], FILE_ATTRIBUTE_DIRECTORY
	je	wmgetlistlevel3
wmgetlistlevel4:
	lea	eax, [findfileSTR.cFileName]
	mov	[Ctemp], eax
	invoke	lstrlen, [Ctemp]
	cmp	eax, MAX_LENGHTNAMELEV
	jnl	wmgetlistlevel3
	mov	ecx, [Ctemp]
	add	ecx, eax
	sub	ecx, 4
	mov	byte ptr [ecx], 0
	invoke	lstrcpy, [ipMemListLev], [Ctemp]
	add	[ipMemListLev], MAX_LENGHTNAMELEV	
	inc	[CountLevel]
	jmp	wmgetlistlevel3
wmgetlistlevel2:
	invoke	FindClose, [hFindFile]
	invoke	GlobalLock, [hMemListLev]
	mov	[ipMemListLev], eax
MAX_CNTLEVEL и MAX_LENGHTNAMELEV - это константы.
MaskFileLev - маска поиска, например так "*.txt", 0
findfileSTR - соответственно структура WIN32_FIND_DATA

А вообще по форуму поищите, примеров примерно тыща.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 19.12.2010, 14:11   #3
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию

Спасибо Ulex
assch вне форума Ответить с цитированием
Старый 20.12.2010, 00:46   #4
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию

В этой конструкции MessageBox при каждом нажатии выводит название следующего файла
лежащего в данной директории то есть выводит их по одному
А что нужно добавить в данную конструкцию чтобы MessageBox добавлял и показывал файлы каждый раз с новой строки
Чтобы в конце получился список всех файлов (каждый файл на своей строчке то есть как бы список)
Код:
.386
.model flat, stdcall
option casemap :none   

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

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib

.data

box    db "Файлы",0
maska  DB "*.*",0
find    WIN32_FIND_DATA <0>       
handl  DD ?

.code
start:

invoke FindFirstFile,ADDR maska,ADDR find
MOV handl,EAX
LF:
CMP find.cFileName,"."
JE SD
invoke MessageBox,0,ADDR find.cFileName,ADDR box,20h
SD:
invoke FindNextFile,handl,ADDR find
CMP EAX,0
JNE LF
invoke FindClose,handl
invoke ExitProcess,0

end start
assch вне форума Ответить с цитированием
Старый 20.12.2010, 03:24   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Можно так
Код:
.data?
big_string db 10000 dup (?)

.code
start:

mov	[big_string+0], 0
lea	edi, [big_string]
invoke FindFirstFile,ADDR maska,ADDR find
MOV handl,EAX
LF:
CMP find.cFileName,"."
JE SD
mov	dword ptr [edi], 00000a0dh
add	edi, 2
invoke	lstrcat, edi, addr [find.cFileName]
invoke	lstrlen, addr [find.cFileName]
add	edi, eax
invoke MessageBox,0, addr [big_string + 2],ADDR box,20h
SD:
invoke FindNextFile,handl,ADDR find
CMP EAX,0
JNE LF
invoke FindClose,handl

invoke ExitProcess,0

end start
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 20.12.2010, 13:56   #6
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию

Большое спасибо за помощь Ulex
Подскажи пожалуйста что теперь нужно изменить в коде чтобы список выводился сразу.
MessageBox я использую просто для наглядности.
В принцыпи меня интересует переменная в которой формируется сам список.
Чтобы потом создать текстовый файл и записать в него также в строчку этот список.
То есть просто создавался бы текстовый файл со списком.

Последний раз редактировалось assch; 20.12.2010 в 13:58.
assch вне форума Ответить с цитированием
Старый 20.12.2010, 22:36   #7
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию

Эта конструкция уже выводит все файлы в директории с помощью рекурсии.
Только столкнулсяс проблемой
При инициализации string db 260 dup (0) в переменную string умещается не большое количество строк
попробывал увеличить string db 60000 dup (0) стало умещатся больше только всё равно например папка C:\Program Files не уместилась
выдал ошибку
Не подскажете в чём дело
Код:
.386
.model flat, stdcall
option casemap :none   

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

includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib

.data

    dd     50 dup(0)
    MASKA  dd "*.*"
    dd     50 DUP(0)
    AP     dd "\",0
    
    fil    db "Файл",0
    pap    db "Папка",0
    BUF    DB    0
	FIN    WIN32_FIND_DATA <0>
	NUMF   DWORD 0   ;счетчик файлов
	NUMD   DWORD 0   ;счетчик каталогов
	DIRN   DB " <DIR>",0
    PRIZN  DB 0
    string  db 260 dup (0)
    
.code
start:
lea	esi, string
PUSH  OFFSET BUF
CALL  FIND
invoke MessageBox,0,ADDR string,ADDR fil,20h
invoke ExitProcess,0
	
;поиск в каталоге файлов и их вывод
FIND PROC

FINDH   EQU  [EBP-4]   ;дескриптор поиска
DIRS    EQU  [EBP-304] ;полное имя файла
DIRSS   EQU  [EBP-604] ;для хранения каталога
DIRV    EQU  [EBP-904] ;для временного хранения
DIR     EQU  [EBP+8]   ;параметр - имя каталога
	
    PUSH EBP
	MOV  EBP,ESP
	SUB  ESP,904
;инициализация локальный переменных
	MOV   ECX,300
	MOV   AL,0
	MOV   EDI,0
CLR:
	MOV   BYTE PTR DIRS+[EDI],AL
	MOV   BYTE PTR DIRSS+[EDI],AL
	MOV   BYTE PTR DIRV+[EDI],AL
	INC   EDI
	LOOP  CLR
;определить длину пути
	invoke lstrlen,DIR
	MOV   EBX,EAX
	MOV   EDI,DIR
	CMP   BYTE PTR [EDI],0
	JE    _OK
;если в конце нет "\" - добавим
	CMP   BYTE PTR [EDI+EBX-1],"\"
	JE    _OK
	invoke lstrcat,DIR,ADDR AP
_OK:
;запомним каталог
	LEA   EAX,DIRSS
	invoke lstrcpy,EAX,DIR
;путь с маской
	invoke lstrcat,DIR,ADDR MASKA
;здесь начало поиска
	invoke FindFirstFile,DIR,ADDR FIN
	CMP   EAX,-1
	JE   _ERR
;сохранить дескриптор поиска 
	MOV  FINDH,EAX
LF:
;исключить "файлы" "." и ".."
	CMP  BYTE PTR FIN.cFileName,"."
	JE   _FF
;------------------
	LEA   EBX,DIRSS
	LEA   EAX,DIRS
	invoke lstrcpy,EAX,EBX
;------------------
	LEA  EAX,DIRS
	invoke lstrcat,EAX,ADDR FIN.cFileName
;не каталог ли?
	TEST BYTE PTR FIN.dwFileAttributes,10H 
	JE   NO_DIR
;добавить в строку <DIR>
	LEA  EAX,DIRS
	invoke lstrcat,EAX,ADDR DIRN
;увеличим счетчики
	INC  NUMD
	DEC  NUMF
;установим признак каталога
	MOV  PRIZN,1
;вывести имя каталога
    invoke lstrcat,esi,ADDR DIRS
    invoke	lstrlen, esi
    add	esi, eax
    mov	dword ptr [esi], 000000da0h
    add	edi, 2
    ;invoke MessageBox,0,ADDR string,ADDR fil,20h
    JMP  _NO
NO_DIR:
;вывести имя файла
    invoke lstrcat,esi,ADDR DIRS
    invoke	lstrlen, esi
    add	esi, eax
    mov	dword ptr [esi], 000000da0h
    add	edi, 2
    ;invoke MessageBox,0,ADDR string,ADDR fil,20h
;признак файла (не каталога)
	MOV  PRIZN,0
_NO:
	CMP  PRIZN,0
	JZ   _F
;каталог, готовимся к рекурсивному вызову
	LEA   EBX,DIRSS
	LEA   EAX,DIRV
	invoke lstrcpy,EAX,EBX
	LEA   EAX,DIRV
	invoke lstrcat,EAX,ADDR FIN.cFileName
;осуществляем вызов
	LEA   EAX,DIRV
	PUSH  EAX
	CALL FIND
;продолжение поиска
_F:
	INC  NUMF 
_FF:
	invoke FindNextFile,FINDH,ADDR FIN
	MOV  EBX,EAX
	CMP  EBX,0
	JNE  LF
;закрыть дескриптор поиска
invoke FindClose,FINDH 
_ERR:   
	MOV  ESP,EBP
	POP  EBP
	RET  4
FIND ENDP

end start

Последний раз редактировалось assch; 21.12.2010 в 02:35.
assch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести список файлов assch Общие вопросы C/C++ 1 21.10.2010 03:16
Определить и вывести список файлов в папке SMShrek Microsoft Office Excel 6 17.05.2010 16:43
в label1 вывести текстовый файл lanus Помощь студентам 2 12.03.2010 16:15
Сохранить список файлов и папок в определённой директории в текстовый файл Az@zel Помощь студентам 5 10.03.2010 20:41
как определить какие файлы есть в папке и вывести их имена в текстовый файл Tdoctor Паскаль, Turbo Pascal, PascalABC.NET 3 04.11.2008 05:18