Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как сделать дерево каталогов (директорий) 
:(
    Опции темы
Klio
  Дата 6.5.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.4.2008
Где: Харьков - СС_3

Репутация: нет
Всего: 1



Как можно создать дерево каталогов находящихся на определённом диске, с учётом уровня вложенности – уровень естественно числовое значение! Чтобы каталоги имеющие вложенность более этого значения - не учитывались!?!
Заранее спасибо!
PM MAIL ICQ   Вверх
500mhz
Дата 7.5.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: нет
Всего: 14



под какую ОС то?


--------------------

PM MAIL ICQ   Вверх
Klio
Дата 7.5.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.4.2008
Где: Харьков - СС_3

Репутация: нет
Всего: 1



под красивый, чистенький, чёрненький >>>> DOS!!!

Это сообщение отредактировал(а) Klio - 11.5.2008, 18:32
PM MAIL ICQ   Вверх
Klio
Дата 16.5.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.4.2008
Где: Харьков - СС_3

Репутация: нет
Всего: 1



Алгоритм работает через COM файл, часть кода уже была только немного преобразовал
исходный алгоритм - FAQ
Код

; tasm /m scantree.asm
; tlink /t /x scantree.obj

.MODEL Tiny
.286
.CODE
ORG 100h

LOCALS

PathLen   = 100            ; Максимальный путь к файлу/каталогу
                                       ; (уменьшать это значение нежелательно)
Start:
  mov ah,09h       ;
  lea dx,vvyr      ;
  int 21h          ; выводим приглашение
  mov ah,01h       ; ожидаем ввода клавиши  PS вводите только цифру т.к. проверки нет
  int 21h          
  sub al,30h       ; переводим из ASCII в число
  add al,1         ; так надо
  mov MAX_U_V,al   ; записываем значение в MAX_U_V
  mov U_V,0        ; записываем нулевой уровень
    push  offset MyFunc ; вывод персоначальной директории
    call  ScanTree  ; первый вызов Сканирования директории
    int 20h

  mov ah,01h
  int 21h

MyFunc    proc
    lea di,ScanPath    ; DI = адрес строки ScanPath
    push di
    mov cx,PathLen
    xor al,al
    repne scasb          ; Ищем конец строки
    dec di
    mov word ptr [di],0A0Dh ; Записываем туда CR,LF...
    mov byte ptr [di+2],'$' ; ...и символ доллара (для ф-ии 9)
    pop dx
    push dx
    mov ah,9
    int 21h            ; Выводим строку на экран

  pop dx
    mov byte ptr [di],0; Восстанавливаем строку ScanPath
                           ; (т.к. изменять ее нельзя)
    ret
MyFunc    endp

; Маски атрибутов файлов/каталогов
faReadOnly  = 1
faHidden  = 2
faSystem  = 4
faVolume  = 8
faDirectory = 10h
faArchive = 20h
faAnyFile =       faReadOnly+faHidden+faSystem+faArchive
faAnyDir  = faAnyFile+faDirectory
faAnithing  = faAnyDir+faVolume

; Описание буфера DTA
DTAFileInfo struc
dtaReserved db  21 dup (?)
dtaAttr   db  ?
dtaTime   dw  ?
dtaDate   dw  ?
dtaSize   dd  ?
dtaName   db  13 dup (?)
ends

ScanTree  proc  pascal
arg   Func:word
local   OldDTA:dword, NewDTA:DTAFileInfo
; ES всегда равно первоначальному DS !!!
    push ds             ; Сохраняем DS
    inc U_V
    mov ah,2Fh
    int 21h            ; Получаем адрес DTA
    mov word ptr OldDTA[0],bx ; Сохраняем его...
    mov word ptr OldDTA[2],es ; ...в переменной OldDTA
    pop es             ; Восстанавливаем DS в регистр ES (ES=DS)
    lea di,ScanPath
    mov cx,PathLen
    xor al,al
    cld                    ; Прямой порядок поиска scasb
    repne scasb          ; Ищем в имени каталога нулевой байт (конец строки)
    dec di
    push di             ; Сохраняем указатель на ноль
    push ds es          ; Сохраняем DS и ES
    call Func           ; Вызываем функцию для стартового каталога
    mov ah,1Ah
    push ss
    pop ds             ; DS = SS (сегмент NewDTA)
    lea dx,NewDTA
    int 21h            ; Устанавливаем свой DTA
    pop es ds          ; Восстанавливаем DS и ES (ES=DS)
    mov ah,4Eh         ; Готовимся в началу поиска
    mov cx,faAnyDir    ; Атрибуты (все, кроме Volume label)
    lea dx,ScanPath
    lea si,ScanMask    ; SI = адрес макси поиска
    pop di             ; Восстанавливаем DI (указатель на конец строки)...
    push di             ; ...и тут же сохраняем его
    cld                    ; Прямой порядок работы lodsb/stosb
@@CopyMask: lodsb                  ; Читаем в AL символ из строки [SI]
    stosb                  ; И записываем его в конец ScanPath
    or al,al          ; Конец строки [SI] (AL=0) ?
    jnz @@CopyMask     ; Нет, копируем следующий символ
@@FindNext:
    int 21h            ; Начинаем/продолжаем поиск
    jc  @@NotFound     ; Выходим, если ничего не найдено (CF=1)
    push ss
    pop ds             ; DS = SS (сегмент NewDTA)

    test  NewDTA.dtaAttr,faDirectory ; Проверяем - каталог ли был найден
    jz  @@PrepareNext  ; Если нет, готовимся продолжать поиск
    lea si,NewDTA.dtaName ; Адрес имени найденного файла/каталога
    lodsb             ; Читаем первый символ

;-----------------------
    mov hh,ah      ; сохраняем ah в hh
    mov ah,U_V        ; в ah записываем текущую вложенность
    cmp ah,MAX_U_V    ; сравниваем это значение с максимальной
      jl GGG       ; если оно меньше то идём далее без изменений  с метки GGG
    mov al,'.'     ; если всё же больше или равны то изминяем имя каталога на точку 
GGG:mov ah,hh      ; возращаем ah её первоначальное состояние
;-----------------------
    cmp al,'.'         ; Это каталоги '.' и '..'? (нам такие не нужны)
    je  @@PrepareNext  ; Если это они, готовимся продолжать поиск
    pop di             ; Восстанавливаем DI (указатель на конец строки)...
    push  di             ; ...и тут же сохраняем его
@@CopyPath: 
    stosb                  ; Записываем символ строки [SI] в конец ScanPath
    lodsb                  ; Читаем в AL символ из строки [SI]
    or al,al          ; Конец строки [SI] (AL=0) ?
    jnz @@CopyPath     ; Нет, копируем следующий символ
    mov ax,'\'         ; AH = 0, AL = '\'
    stosw                  ; Записываем слэш и ноль в конец строки
    push es
    pop ds             ; DS = ES
    push Func
    call ScanTree       ; Вызываем себя рекурсивно
    push ss
    pop ds             ; DS = SS (сегмент NewDTA)
@@PrepareNext:
    mov ah,4Fh         ; Готовимся к функции 4Fh
    lea dx,NewDTA
    jmp @@FindNext     ; Продолжаем поиск
@@NotFound:
    pop di             ; Убираем из стека DI
    mov ah,1Ah
    lds dx,OldDTA
    int 21h            ; Восстанавливаем DTA
    dec U_V       ; УМЕНЬШАЕМ ЗНАЧЕНИЕ ВЛОЖЕННОСТИ 
    push es
    pop ds             ; Восстанавливаем первоначальный DS
    ret              ; Выходим из процедуры
ScanTree endp

.DATA
U_V db ?           ; вложенность текущего каталога
MAX_U_V db ?       ; максимальная вложенность
hh db ?                      ; для временного хранения регистра ah пока я его использую
ScanMask  db  '*.*',0        ; Маска каталогов для поиска
StartPath db  'C:\',0        ; Стартовый каталог
ORG StartPath                 ; Совмещаем StartPath и ScanPath
ScanPath  db  PathLen dup (?) ; ASCIIZ-имя найденного каталога
filen db 'C:\Direct.txt',0   ; файл в который идет запись
filed dw ?
ffile db 13,10
vvyr db 'Vvedite yroven vloennotigsti >> $'
exit:
  mov ah,08h
  int 21h
  mov ax,4c00h
  int 21h
END   Start



Если Кто нибуть сделает или знает нормальный алгоритм
и он работает через EXE-файл напишите его!!!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.