Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46

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

17.12.2010, 22:27. Показов 4301. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не подскажете с помощью какой конструкции и связки двух функций
invoke FindFirstFile
invoke FindNextFile
Можно вывести список всех файлов лежащих в какой нибудь папке
и записать этот список в текстовый файл
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2010, 22:27
Ответы с готовыми решениями:

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

Вывести в текстовый файл построчный список имён папок и файлов, добавив в начало каждой строки заданный текст
Здравствуйте есть папка на работе в этой папке есть файлы разные и папки около 100 штук как сделать так что бы ....лучше не так в папке...

Как сделать пакетную обработку файлов и вывести её результаты в текстовый файл?
Добрый день есть утилита, считает хеш по ГОСТУ определенному cpverify.exe -mk Filename -alg GR3411_2012_512 и выдает ...

3
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
20.12.2010, 00:44  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.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
Добавлено через 15 минут
В этой конструкции MessageBox при каждом нажатии выводит название следующего файла
лежащего в данной директории то есть выводит их по одному
А что нужно добавить в данную конструкцию чтобы MessageBox добавлял и показывал файлы каждый раз с новой строки
Чтобы в конце получился список всех файлов (каждый файл на своей строчке то есть как бы список)
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
20.12.2010, 09:43
assch, найди книгу Пирогова "Ассемблер для Windows" там решение твоей задачи
Переделанный текст из Пирогова, чтобы не заморачиваться с кодировкой -- русский текст выведен в СР-866 кодировке. Программа выводит на экран содержимое подкаталогов от того каталога в котором находится сама
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
.686
.model flat,stdcall
option casemap :none
include \masm32\include\windows.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
;объявление используемых функций Windows (внешние ссылки)
extern _imp__wsprintfA:dword
extern _imp__CharToOemA@8:dword;
extern _imp__GetStdHandle@4:dword;
extern _imp__WriteConsoleA@20:dword;
extern _imp__ReadConsoleA@20:dword;
extern _imp__ExitProcess@4:dword;
extern _imp__GetCommandLineA@0:dword;
extern _imp__lstrcat@8:dword;
extern _imp__lstrcpyA@8:dword;
extern _imp__FindFirstFileA@8:dword;
extern _imp__FindNextFileA@8:dword;
extern _imp__FindClose@4:dword;
extern _imp__lstrlenA@4:dword
;---------------------------------------------------------
_FIND STRUC;структура, используемая для поиска файлов при помощи функций FindFirstFileA и FindNextFileA
ATR     dd ?;атрибут файла
CRTIME  dd ?;время создания файла
        dd ?
ACTIME  dd ?;время доступа к файлу
    dd ?    
WRTIME  dd ?;время модификации файла
    dd ?
SIZEH   dd ?;размер файла
SIZEL   dd ?
    dd ?;резерв
    dd ?
NAM db 260 dup(0);длинное имя файла
ANAM db 14 dup(0);короткое имя файла
_FIND ENDS
.code
start:   push STD_INPUT_HANDLE
         call _imp__GetStdHandle@4;получаем HANDL1 для ввода
         mov HANDL1,eax
         push STD_OUTPUT_HANDLE
         call _imp__GetStdHandle@4;получаем HANDL для вывода
         mov HANDL,eax
         call NUMPAR ;получить количество параметров
     mov PAR,eax
     dec eax;если параметр один, то искать в текущем каталоге
     je NO_PAR
     mov edx,2;получить параметр номером edi
     lea ebx,BUF
     call GETPAR
     jb NO_PAR
         mov edi,3;подключить параметр - маску поиска
     lea ebx,MASKA
     call GETPAR
NO_PAR:  push offset BUFER
     call FIND
     push NUMF;вывести количество файлов
     push offset FORM
     push offset BUFER
     call _imp__wsprintfA
     lea eax,BUFER
     mov edi,1
     call WRITE
     push NUMD;вывести количество каталогов
     push offset FORM1
     push offset BUFER
     call _imp__wsprintfA
     lea eax,BUFER
     mov edi,1
     call WRITE
_END:    push 0
         call _imp__ExitProcess@4
;---------------------------------------------------------------
WRITE PROC;вывести строку с переводом строки
     push eax
         push eax
     call _imp__lstrlenA@4;получить длину параметра
     pop ebx
     mov dword ptr [ebx+eax],0D0Ah
     add eax,2
NO_ENT:  push 0;резерв
     push offset LENS;выведено символов
     push eax;длина строки
     push ebx;адрес строки
     push HANDL;HANDL вывода
         call _imp__WriteConsoleA@20;вывести строку 
         RET
WRITE ENDP
;-------------------------------------------------
NUMPAR PROC;определение параметров в командной строке
    call _imp__GetCommandLineA@0
    mov esi,eax
    xor ecx,ecx
    mov edx,1
L1: cmp byte ptr [esi],0
    je L4
        cmp byte ptr [esi],32
    je L3
    add ecx,edx;номер параметра
        xor edx,edx
    jmp L2
L3: or edx,1
L2: inc esi
    jmp L1
L4: mov eax,ecx
    ret
NUMPAR ENDP
;------------------------------------------------------
GETPAR PROC;в edi указатель на буфер, куда помещен параметр
;в ebx номер параметра
        call _imp__GetCommandLineA@0
    mov esi,eax
    xor ecx,ecx
    mov edx,1
L10:    cmp byte ptr [esi],0
    je L40
        cmp byte ptr [esi],32
    je L30
    add ecx,edx;номер параметра
        xor edx,edx
    jmp L20
L30:    or edx,1
L20:    cmp ecx,edi
    jne L50
        mov al,[esi]
    mov [ebx],al
    inc ebx
L50:    inc esi
    jmp L10
L40:    mov byte ptr [ebx],0
    ret
GETPAR ENDP
FIND PROC;поиск в каталоге файлов и вывод имени каталога в BUF
FINDH   equ [ebp-4]
DIRS    equ [ebp-304]
DIRSS   equ [ebp-604]
DIRV    equ [ebp-904]
DIR equ [ebp+8]
    enter 904,0
    xor eax,eax
    lea edi,DIRV
    mov ecx,900/4
    rep stosd
    push DIR
    call _imp__lstrlenA@4
    mov ebx,eax
    mov edi,DIR
    cmp byte ptr [edi],0
    je _OK
    cmp byte ptr [edi+ebx-1],'\'
    je _OK
        push offset AP
    push DIR
    call _imp__lstrcat@8
_OK:    push DIR
    lea eax,DIRSS
    push eax
    call _imp__lstrcpyA@8
    push offset MASKA;путь с маской
    push DIR
    call _imp__lstrcat@8
        push offset FIN;здесь начало поиска
    push DIR
    call _imp__FindFirstFileA@8
    inc eax;cmp eax,-1
    je _ERR
    dec eax
    mov FINDH,eax;сохранить дескриптор поиска
LF: cmp byte ptr FIN.NAM,".";исключить файлы "." и ".."
    je _FF
    lea eax,DIRSS
    push eax
    lea eax,DIRS
    push eax
    call _imp__lstrcpyA@8
        push offset FIN.NAM
    lea eax,DIRS
        push eax
    call _imp__lstrcat@8
    test byte ptr FIN.ATR,10h;не каталог ли?
    je NO_DIR
    push offset DIRN
    lea eax,DIRS
        push eax
    call _imp__lstrcat@8
        inc NUMD
    dec NUMF
    mov PRIZN,1
    lea eax,DIRS
    push eax
    call OUTF
    jmp _NO
NO_DIR: lea eax,DIRS
    push eax
    call OUTF
    mov PRIZN,0
_NO:    cmp PRIZN,0
        jz _F
        lea eax,DIRSS
    push eax
    lea eax,DIRV
    push eax
    call _imp__lstrcpyA@8
    push offset FIN.NAM
    lea eax,DIRV
    push eax
    call _imp__lstrcat@8
    lea eax,DIRV
    push eax
    call FIND
_F: inc NUMF
_FF:    push offset FIN
    push FINDH
    call _imp__FindNextFileA@8;продолжение поиска
    test eax,eax;cmp eax,0
    jne LF
    push FINDH
    call _imp__FindClose@4;закрыть поиск
_ERR:   leave
    ret 4
FIND ENDP
OUTF proc
STRN    equ [ebp+8]
    push ebp
    mov ebp,esp
    push STRN
    push STRN
    call _imp__CharToOemA@8;преобразовать строку
    mov eax,STRN
    mov edi,1
    call WRITE;здесь вывод результата
    inc NUM
    cmp NUM,22;конец страницы?
    jne NO
    mov NUM,0
    mov edi,1
    lea eax,TEXT
    call WRITE;ждать вывод строки
    push 0
    push offset LENS
    push 10
    push offset BUFIN
    push HANDL1
    call _imp__ReadConsoleA@20
NO: pop ebp
    ret 4
OUTF endp
;------------------------------------------
.data
BUF     db 0
    db 100 dup (?)
LENS    dd 100;количество выведенных символов
HANDL   dd ?
HANDL1  dd ?
MASKA   db "*.*",0
AP  db "\",0
FIN _FIND <0>
TEXT    db '"<п ЇаR¤R<│_-Ёп -*│┐Ёв_ Є<*ўЁиг ENTER',13,10,0
; в DOS кодировке 'Для продолжения нажмите клавишу ENTER'
BUFIN   db 10 dup(0)
NUM db 0
NUMF    dd 0;счетчик файлов
NUMD    dd 0;счетчик каталогов
FORM    db '-Ёб<R -*c¤_-ле д*c<Rў: %lu',0
;'Число найденых файлов: %lu'
FORM1   db '-Ёб<R -*c¤_-ле Є*в*<R_Rў: %lu',0
;'Число найденых каталогов: %lu'
BUFER   db 100 dup(0)
DIRN    db " <DIR>",0
PAR     dd 0;количество параметров
PRIZN   db 0      
end start
0
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
21.12.2010, 00:17  [ТС]
Спасибо Mikl
Этот код я и сделал из этого кода который ты дал то есть из кода описанного в книги Пирогова
Только переделал его на invoke Только код у Пирогова заточен на консоль
MessageBox я использую просто для наглядности.
В принцыпи меня интересует переменная в которой формируется сам список.
Чтобы потом создать текстовый файл и записать в него также в строчку этот список.

Добавлено через 10 часов 7 минут
Эта конструкция уже выводит все файлы в директории с помощью рекурсии.
Только здесь у меня не получается сделать чтобы на месабоксе информация
выводилась строчками. Она выводится в сплошной ряд.
Подскажите пожалуйста что там нужно добавить или исправить чтобы список выводился строчками
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
.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
 
    fil    db "Файл",0
    pap    db "Папка",0
    BUF    DB    0
    DB    100 dup(0) 
    MASKA  DB "*.*"
    DB 50 DUP(0)
    AP     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    edi, 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,ADDR string,ADDR DIRS
    invoke MessageBox,0,ADDR string,ADDR pap,20h
    
    JMP  _NO
NO_DIR:
;вывести имя файла
 
    invoke lstrcat,ADDR string,ADDR DIRS
    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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2010, 00:17
Помогаю со студенческими работами здесь

Упорядочить список в порядке возрастания даты и вывести в текстовый файл
В магазине имеется список лиц, заказавших мебель. Каждая запись этого списка содержит порядковый номер, фамилию, домашний адрес покупателя,...

Текстовый файл содержит список фамилий и должность сотрудников. Сформировать текстовый файл, содержащий фамил
Текстовый файл содержит список фамилий и должность сотрудников. Сформировать текстовый файл, содержащий фамилии сотрудников, работающих ...

Поместить список файлов текущего каталога в текстовый файл и в зависимости от ключа сортировать по какому-либо полю
Условие:&quot;Разработать командный файл, который помещает список файлов текущего каталога в текстовый файл и в зависимости от ключа сортирует...

Вывести в текстовый файл значения размеров и расширений всех файлов в указанной папке
Нужно вывести в текстовый файл значения размеров и расширений всех файлов в указанной папке (можно с именами) формат файла таков,...

Дан текстовый файл с программой. Вывести список всех процедур, не описанных в блоке описания
Задача: Дан текстовый файл, содержащий строки длиной до 255 символов. Файл является программой на языке Паскаль. Определить все ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru