Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Флейм > Длинные имена файлов под ДОС


Автор: Shuricksoft 16.6.2003, 21:52
Собственно, сабж. Хотелось бы написать прогу под ДОС, которая бы видела длинные имена файлов. Насколько это реально? Где можно почитать о длинных именах?

Автор: Master 17.6.2003, 09:39
В пакете DOS, есть утилита copy32.exe, но это для копирования.

Автор: DENNN 17.6.2003, 10:52
Давай немного разберемся. Уже под Win95 отдельно ДОСа нет - он теперь часть виндов. И он абсолютно корректно работает с длинными именами файлов.
Код

cd "c:\program files\microsoft visual studio\"

Можешь начинать писать обычное консольное приложениеsmile.gif

Автор: Chingachguk 17.6.2003, 11:53
Цитата

--------D-2171-------------------------------
INT 21 - Windows95 - LONG FILENAME FUNCTIONS
AH = 71h
AL = function
    0Dh reset drive (see AX=710Dh)
    39h create directory (see AX=7139h)
    3Ah remove directory (see AX=713Ah)
    3Bh set current directory (see AX=713Bh)
    41h delete file (see AX=7141h)
    43h get/set file attributes (see AX=7143h)
    47h get current directory (see AX=7147h)
    4Eh find first file (see AX=714Eh)
    4Fh find next file (see AX=714Fh)
    56h move (rename) file (see AX=7156h)
    60h truename (see AX=7160h/CL=00h,AX=7160h/CL=02h)
    6Ch create/open file (see AX=716Ch)
    A0h get volume information (see AX=71A0h)
    A1h terminate FindFirst/FindNext (see AX=71A1h)
    A6h get file information (see AX=71A6h)
    A7h time conversion (see AX=71A7h/BL=00h,AX=71A7h/BL=01h)
    A8h generate short filename (see AX=71A8h)
    A9h server create/open file (see AX=71A9h)
    AAh create/terminate SUBST (see AX=71AAh/BH=00h,AX=71AAh/BH=02h)
Return: CF set on error
    AX = error code (see #01680)
  7100h if function not supported
CF clear if successful
    other registers as for corresponding "old" DOS function
Notes: if error 7100h is returned, the old-style function should be called
AX=714Eh returns a "search handle" which must be passed to AX=714Fh;
  when the search is complete, AX=71A1h must be called to terminate
  the search
for compatibility with DOS versions prior to v7.00, the carry flag
  should be set on call to ensure that it is set on exit
Caldera's DPMS-enabled LONGNAME.EXE BETA 1 extension for DR-DOS 7
  supports the following sub-set of LFN functions: 39h, 3Ah, 3Bh, 41h,
  43h (BL = 0, 1 only), 47h, 4Eh, 4Fh, 56h, 60h (CL = 0, 1, 2), 6Ch,
  A0h, A1h, A8h. BETA 2 fixes LFN directory entry checksums, which
  were causing wrong LFNs to be attached to a file. The 8.3 short
  names for filenames with exactly 8 chars are no longer abbreviated
  (e.g. LONGNAME.TXT -> LONGNAME.TXT, not LONGNA~1.TXT). BETA 3 has
  A7h (BL=0, 1) functions added, and 4Eh/4Fh can return file times
  in both DOS and 64 bit formats, BETA 4 has support added for
  Caldera's DRFAT32 redirector extension (see INT 2F/AX=15xxh).
Caldera's DR-OpenDOS 7.02+ COMMAND.COM utilizes the LFN API as soon
  as it detects it (mind, that LONGNAME.EXE can be dynamically loaded
  and unloaded at runtime). This COMMAND.COM shell also works under
  MS-DOS/PC DOS and in DOS boxes of Windows9x, NT, 2000, and OS/2.
For 4DOS 6.02+ to work with 3rd party LFN providers, the Win95LFN=Yes
  directive should be inserted into the 4DOS.INI file.
Mike Podanoffsky's RxDOS 7.2 provides most of this API natively,
  including functions 39h, 3Ah, 3Bh, 41h, 43h (BL = confused.gif), 47h, 4Bh,
  4Eh, 4Fh, 56h, 60h (CL = 0, 1, 2, no CH), 6Ch, A0h, A1h and A7h.
  However, not all sub-functions seem to be supported yet.
SeeAlso: AH=39h,AH=3Ah,AH=3Bh,AH=41h,AX=4300h,AX=4301h,AX=4304h,AX=4306h
SeeAlso: AX=4307h,AH=47h,AH=4Eh,AH=4Fh,AH=56h,AH=6Ch,AX=714Eh,AX=714Fh

Автор: Chingachguk 17.6.2003, 11:55
Цитата

text segment byte
assume cs:text,ds:text
org 100h
begin:
  mov  ah,09h
  mov  dx,offset Message
  int  21h
; INT 21 - Windows95 - LONG FILENAME - MAKE DIRECTORY
; AX = 7139h
; DS:DX -> ASCIZ long directory name (including path)

  mov  ax,7139h
  mov  dx,offset LogFileName ; DS:DX - имя файла
  int  21h                  ; создать/открыть файл
  jc  @@LogOpenErr
  mov  bx,ax
  mov  ah,3Eh
  int  21h
  ret
@@LogOpenErr:
  mov  ah,09h
  mov  dx,offset NotCreated
  int  21h
  ret
Message db 'test',13,10,'$'
NotCreated db 'Not Created !',13,10,'$'
LogFileName db 'my_file_with_big_name.my_extension',0
text ends
end begin

Автор: Shuricksoft 17.6.2003, 15:19
Цитата
В пакете DOS, есть утилита copy32.exe, но это для копирования.

Мне не копировать надо, а просто интересует тема.
Цитата
Уже под Win95 отдельно ДОСа нет

Я имел в виду именно ДОС. Например, 6.22.
Цитата
И он абсолютно корректно работает с длинными именами файлов

Позволь с тобой не согласиться. Корректно он работает только под Виндоусом в ДОСовском окошке. А вот в "режиме эмуляции" - нифига.
To Chingachguk: Спасибо за описание и код! Только вот беда: он тоже не канает под ДОСом и в режиме эмуляции.
Ещё какие-нибудь предложения? Кто-нибудь знает, как эти имена туда физически записываются?

Автор: Chingachguk 17.6.2003, 15:29
Цитата

Кто-нибудь знает, как эти имена туда физически записываются?


Где-то я читал про это... То ли в Пирогове, то ли в Зубкове (более вероятно). Длинные имена в винде - это же надстройка (над фатом ?). В каком-то там описателе файла в этой ФАТ валяется признак, что имя - расширенное. Вроде бы этот признак - символ "~" или чего-то вроде того в конце обычного имени. Если винда натыкается на него (на признак), то ломится куда-то в свою дополнительную область данных и читает все остальное...

Автор: Chingachguk 17.6.2003, 15:38
Да и инфы много. Называется это VFAT:

Цитата

3. DOS FAT 12/16/32, VFAT


3.1 VFAT: Long filenames
Windows 95/98 and Windows NT/2000 store long filenames on FAT in special directory entries with set attributes ReadOnly, Hidden, System and Volume, so if you access FAT volume from DOS you don't see these "files". These special entries have this mad structure:


byte              sequence number for slot
string(10)        first 5 characters in name
byte              attribute byte
byte              always 0
byte              checksum for 8.3 alias
string(12)        6 more characters in name
word              starting cluster number, 0 in long slots
string(4)        last 2 characters in name

Problem occur when you delete or modify file with long name from system without VFAT support, because only DOS 8+3 entry will be deleted or modified. Scandisk from Windows 95/98 can repair this problem

Автор: Shuricksoft 8.7.2003, 14:02
Сенкс. Только непонятно: так можно ли из чистого ДОСа получить доступ к этомк самому "специальному каталогу" (то есть, прочитать длинные имена)? Если да, то как?

Автор: p0s0l 14.7.2003, 01:10
То что это сделать можно - это 100%, и это даже ОЧЕНЬ легко, но повозится придется.

Длинные имена хранятся там же где и короткие, т.е. в каталоге, как обычные короткие имена, только
с одним отличием - у них поставлены атрибуты sys+hid+readonly+volume, вроде. Флаг volume делает эти записи каталога бессмысленными. Поэтому dos такие записи пропускает.
Каждому короткому имени может соответствовать несколько записей длинного имени.
например, длинное имя = abcdefghijklmnopqrstuvxyz.
Тогда в каталоге будут записи с такими именами:

.n.o.p.q.r....s.
t.u.v.x.y...z...

.a.b.c.d.e....f.
g.h.i.j.k...l.m.

ABCDEF~1 ....
................


Длинные имена хранятся в виде WideString (символ = 2 байта).
Как написал Chingachquk, для поддержания целостности введены порядковый номер и контрольная сумма (считается от короткого имени).
Блин, ну тут много можно написать, но лучше будет если ты скачаешь кульную прогу WinHex http://www.winhex.com
В ней ты можешь посмотреть кишки винта, прога работает напрямую с диском. Открой в ней какой-нибудь каталог и ты все поймешь.

Ну и потом останется тебе только написать прогу под дос с использованием int 13 или int 25.
Ну это уже другая тема...


Автор: kruchinin 14.7.2003, 18:09
Я сколько ни пробовал - ни одна программа не позволяет это делать под DOS.
Старые WinRar позволяют архивировать для DOSа длинные имена файлов.
Они даже видятся при просмотре, но при разархивации получаются урезанные до 8 символов.

Так я думаю стандартными функциями ДОС ты этого не добьешься, тебе надо лезть в FAT, и я думаю , что игра не стоит свеч

Автор: p0s0l 15.7.2003, 15:18
Да, чтобы прочитать каталог, придется последовательно узнавать номера кластеров каталога из FAT.
Только в этом ничего страшного нет.

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