Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск самого длинного имени файла, в корневом каталоге 
:(
    Опции темы
dvd
Дата 1.6.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 6.7.2005

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



Как найти файл с самым длинным именем в КК (дискета)?
Помогите, плз...  
--------------------
Санкт-Петербург такси
PM MAIL WWW   Вверх
ds29
Дата 2.6.2006, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 15.3.2006

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



под что?

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

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

когда пройдёшь все файлы, в строковой переменной с именем останется самое длинное имя, а во временной, кол-во сим-лов. 
PM MAIL   Вверх
e-moe
Дата 2.6.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 3.8.2004
Где: Украина, Донецк

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



Да, и не забывай учитывать что на дискете могут быть имена как 8+3 так и LFN ;) 
PM MAIL WWW ICQ   Вверх
dvd
Дата 3.6.2006, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 6.7.2005

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



Да принцип-то понятен... А вот с реализацией есть проблемы. Имена можно ограничить длиной "8".  
--------------------
Санкт-Петербург такси
PM MAIL WWW   Вверх
ds29
Дата 3.6.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 15.3.2006

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



ты под что пишешь, если под 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)



 
PM MAIL   Вверх
e-moe
Дата 3.6.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 3.8.2004
Где: Украина, Донецк

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



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

Это сообщение отредактировал(а) e-moe - 3.6.2006, 21:13
PM MAIL WWW ICQ   Вверх
dvd
Дата 4.6.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 6.7.2005

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



Ну так я перебираю символы имени файла:

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)... 
--------------------
Санкт-Петербург такси
PM MAIL WWW   Вверх
ds29
Дата 4.6.2006, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 15.3.2006

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



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. теоретически рабочий код.
так на чём и под что ты пишешь??


 
PM MAIL   Вверх
dvd
Дата 4.6.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 6.7.2005

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



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

Я пишу под DOS
TASM 
--------------------
Санкт-Петербург такси
PM MAIL WWW   Вверх
ds29
Дата 4.6.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 15.3.2006

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



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

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

 
PM MAIL   Вверх
dvd
Дата 5.6.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 6.7.2005

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



Такое сканирование будет неправильным, т.к. конец имени файла обозначается 20h, поэтому проверка имени файла будет выглядеть так, как я описал чуть выше:
        mov ah,2
        mov dl,Sect[di]
        cmp dl,20h
Этот метод уже проверен - имена выводятся правильно, а вот самое длинное никак не получается найти... 
--------------------
Санкт-Петербург такси
PM MAIL WWW   Вверх
ds29
Дата 5.6.2006, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 15.3.2006

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



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))


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

а что не получается с поиском самого длинного имени, я же привел пример алогоритма.
 
PM MAIL   Вверх
dvd
Дата 5.6.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 6.7.2005

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



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

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

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


 




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


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

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