Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Поиск самого длинного имени файла


Автор: dvd 1.6.2006, 22:54
Как найти файл с самым длинным именем в КК (дискета)?
Помогите, плз...  

Автор: ds29 2.6.2006, 01:16
под что?

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

3. поиск следующего файла , сравнение длин: если длина больше то заменяй переменную с именем файла, иначе пункт №3.

когда пройдёшь все файлы, в строковой переменной с именем останется самое длинное имя, а во временной, кол-во сим-лов. 

Автор: e-moe 2.6.2006, 13:46
Да, и не забывай учитывать что на дискете могут быть имена как 8+3 так и LFN ;) 

Автор: dvd 3.6.2006, 20:25
Да принцип-то понятен... А вот с реализацией есть проблемы. Имена можно ограничить длиной "8".  

Автор: ds29 3.6.2006, 21:11
ты под что пишешь, если под Win32 то там такая структура:

typedef struct _WIN32_FIND_DATA { // wfd  
    DWORD dwFileAttributes; 
    FILETIME ftCreationTime; 
    FILETIME ftLastAccessTime; 
    FILETIME ftLastWriteTime; 
    DWORD    nFileSizeHigh; 
    DWORD    nFileSizeLow; 
    DWORD    dwReserved0; 
    DWORD    dwReserved1; 
    TCHAR    cFileName[ MAX_PATH ]; 
    TCHAR    cAlternateFileName[ 14 ]; 
} WIN32_FIND_DATA; 

здесь:
cFileName - длинное имя (260)
и cAlternateFileName - короткое имя (14) т.е. (8.3)



 

Автор: e-moe 3.6.2006, 21:12
dvd, в чем проблема?
используй, например, ah=4eh/4fh int 21h (это если короткие имена) 

Автор: dvd 4.6.2006, 00:11
Ну так я перебираю символы имени файла:

cycl1:
        mov ah,2
        mov dl,Sect[di]
        cmp dl,20h
        je net
        inc di
        cmp di,si
        jl cycl1

Дальше, по идее, нужно создать что-то наподобие стандартного поиска максимума (if a> max then max:=a)... 

Автор: ds29 4.6.2006, 01:33
dvd, так под что пишешь то? DOS или WIN32 ???

вот небольшой пример:

.data

big_name db 14 dup(0) ; длинное имя
now_name db 14 dup(0) ;  текущее имя

name_len db 0 ;длина имени


.code


find_next_file:
;тут находишь имя следующего файл (его в now_name)
;///
;///
;..

;если файлов больше нет то jmp end_find_dig_f
xor ax,ax
lea di,now_name

m1:
cmp [di],al ; (сравнение с нулём)
jne m2
inc ah ;счётчик
inc di
jmp m1


m2:
cmp ah,name_len
jb m3 ;если текущее имя меньше

mov cx,14
lea di,now_name
lea si,big_name
mov name_len,ah

recopy: ; если текущее имя больше то big_name = now_name & name_len = ah
mov al,[di]
mov [si],al
inc di
inc si
loop recopy

m3:

;тут на данный момент в big_name - будет имя наибольшего по кол-ву сим. файла
;а в name_len - кол-во символов в нём

jmp find_next_file

end_find_dig_f:
;тут окончательный результат

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

p.s. теоретически рабочий код.
так на чём и под что ты пишешь??


 

Автор: dvd 4.6.2006, 13:09
ds29, спасибо за пример... Я примерно так и делал, но программа все равно уперто отказывалась правильно работать...
Только вопрос: зачем ты используешь сравнение с нулем?

Я пишу под DOS
TASM 

Автор: ds29 4.6.2006, 13:28
если под ДОС (да и под Вин) , имя файла возвращается ASCIIZ строкой (т.е. в конце 00h)

сканирую строку и сравниваю посимвольно с нулём, если ноль, то предыдущий символ был последний, => текущее значение счётчика символов = кол-ву символов в имени.

 

Автор: dvd 5.6.2006, 00:21
Такое сканирование будет неправильным, т.к. конец имени файла обозначается 20h, поэтому проверка имени файла будет выглядеть так, как я описал чуть выше:
        mov ah,2
        mov dl,Sect[di]
        cmp dl,20h
Этот метод уже проверен - имена выводятся правильно, а вот самое длинное никак не получается найти... 

Автор: ds29 5.6.2006, 02:04
dvd, аргументируй

ты хочешь сказать что в структуре DTA
-----------------------------------------------------------
+00h 21 Данные, используемые функцией 4Fh (для нас не представляют интереса) 
+15h 1 Атрибуты найденного файла/каталога (см. ниже) 
+16h 2 Время создания/редактирования файла/каталога (в специальном формате) 
+18h 2 Дата создания/редактирования файла/каталога (в специальном формате) 
+1Ah 4 Размер файла 
+1Eh 13 Имя файла/каталога в формате ASCIIZ 
-------------------------------------------------------------

данные находящиеся со смещением в +1Eh (т.е. имя файла) находятся НЕ в формате ASCIIZ ?
если да, то приведи ссылку на официальный источник.
(мои утв. основываются на мн-ве источников, например *MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА* (http://e-dok.narod.ru/msdos/book/) , конкретно это прерывание (http://e-dok.narod.ru/msdos/book/gl18-84.html))


**************************************************************

а что не получается с поиском самого длинного имени, я же привел пример алогоритма.
 

Автор: dvd 5.6.2006, 17:15
Я знаю точно (и это проверенно), что конец файла проверяется именно таким способом, но допускаю и другие варианты... Это не столь важно...
Сам алгоритм понятен, но все равно не хочет работать smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)