Как Windows определяет / обрабатывает короткое имя DOS любого данного файла?

у меня есть папка с этими файлами:

alongfilename1.txt <--- created first
alongfilename3.txt <--- created second

когда я запускаю DIR / x в командной строке я вижу эти короткие имена присвоены:

ALONGF~1.TXT alongfilename1.txt
ALONGF~2.TXT alongfilename3.txt

теперь, если я добавлю еще один файл:

alongfilename1.txt 
alongfilename2.txt <--- created third
alongfilename3.txt

Я вижу так:

ALONGF~1.TXT alongfilename1.txt
ALONGF~3.TXT alongfilename2.txt
ALONGF~2.TXT alongfilename3.txt

хорошо. Кажется, он назначает "~ # " в соответствии с датой/временем, когда я создал файл. Правильно ли это?

теперь, если я удалю " alongfilename1.txt", два других файла держите их короткими имена.

ALONGF~3.TXT alongfilename2.txt
ALONGF~2.TXT alongfilename3.txt

когда этот ID (в данном случае ~1) будет выпущен для использования в другом shortname. Будет ли это когда-нибудь?

кроме того, возможно ли, что файл на моей машине имеет короткое имя X, тогда как тот же файл имеет короткое имя Y на другой машине? Я особенно обеспокоен установками, чьи пользовательские действия используют короткие имена DOS.

Спасибо, ребята.

5 ответов


короткое имя файла создается вместе с файлом. Алгоритм работает следующим образом (обычно, но см. moocha ответ):

counter = 1
stripped_filename = strip_dots(strip_non_ascii_characters(filename))
shortfn = first_6_characters(stripped_filename)
while (file_exists(shortfn + "~" + counter + "." + extension)) {
    increment counter by 1
    if more digits are added to counter, shorten shortfn by 1 
    /* e.g. if counter comes to 9 and shortf~9.txt is taken. try short~10.txt next */
}

это означает, что после создания файла он сохранит свое короткое имя, пока не будет удален.

Как только файл будет удален, короткое имя может быть использовано снова.

Если вы переместите файл в другое место, он может получить новое короткое имя (например, вы двигаетесь c:\somefilewithlongname.txt ("c:\somefi~1.тхт") в d:\stuff\somefilewithlongname.txt, если есть d:\stuff\somefileelse - ... txt ("d:\stuff\somefi~1.txt"), короткое имя перемещаемого файла будет somefi~2.формат txt.) Кажется, что короткое имя является постоянным только в данном каталоге на данной машине.

So: короткие имена файлов будут генерироваться файловой системой, как правило, описанным выше методом. Лучше предположить, что короткие имена файлов не являются постоянными, так как c:\longfi~1.txt на одной машине может быть "c:\longfilename - ... формат txt", в то время как на другом это может быть "c:\longfish_story.тхт"; кроме того, когда файл удаляется, короткое имя сразу же.


Если бы я был тобой, я бы никогда полагайтесь на любую версию любого драйвера файловой системы (будь то Microsoft, будь то другая ОС), чтобы быть последовательным в алгоритме, который он использует для создания коротких имен файлов. Точное поведение драйверов Microsoft Fastfat и NTFS не "официально" задокументировано (за исключением несколько обзоров высокого уровня), поэтому не является частью контракта API. Что работает сегодня может не работать завтра, если вы обновите драйвер.

кроме того, есть абсолютно не требуется, чтобы короткие имена содержали символы Тильды-см., например,этот пост Раймонда Чена.

есть сокровищница информации, которую можно найти по этой теме в блогах MSDN - например:

кроме того, не полагайтесь на подошве наличие буквенно-цифровые символы. Посмотри драйвер Linux VFAT что говорит, например, что любое сочетание прописных букв, цифр и следующих символов: $ % ' ` - @ { } ~ ! # ( ) & _ ^. NTFS будет работать в режиме совместимости с этим...


Я считаю, что MSDOS хранит связь между длинным и коротким именем в файле каталога.

Это не зависит от даты/времени.

при перемещении файлов в новый каталог... это сбросит algo, упомянутый Piskvor, снова применяется

в новом каталоге (после перемещения) вы получите:

ALONGF~1.TXT alongfilename1.txt
ALONGF~2.TXT alongfilename2.txt
ALONGF~3.TXT alongfilename3.txt

хотя alongfilename2.txt изначально был создан третьим.


этой ссылке говорит, как NTFS это делает. Я бы предположил, что это все та же идея в более поздней версии.

в Windows 2000 используются как FAT, так и NTFS в набор символов Unicode для их имена, содержащие несколько запрещенных символы, которые MS-DOS не может прочитать. К создание короткого MS-DOS-читаемого файла имя, Windows 2000 удаляет все эти персонажи из LFN и удаляет все пробелы. Потому что MS-DOS-читаемое имя файла может иметь только один период, Windows 2000 также удаляет все дополнительные периоды из имя файла. Далее Windows 2000 при необходимости усекает имя файла, к шести символам добавляется Тильда ( ~ ) и номер. Например, каждый не дубликат имя файла добавляется с ~1 . Конец повторяющихся имен файлов с ~2, затем ~3 и так далее. После имена файлов обрезаются, файл Расширения имен усекаются до трех или меньше персонажей. Наконец, когда отображение имен файлов по команде линия, Windows 2000 переводит все символы в имени файла и расширение в верхний регистр.


когда файлы предоставляются сетевым сервером, на котором выполняется Samba, короткие имена генерируются сервером, и они не следуют предсказуемому шаблону.

поэтому небезопасно предполагать, что вы можете предсказать форму короткого имени.

    G:\>dir /x *.txt

 Directory of G:\

08/25/2009  12:34 PM             1,848 S2XYYV~1.TXT strace_output.txt
03/01/2010  05:32 PM           325,428 TEY7IH~O.TXT tomcat-dump-march-1.txt
03/11/2010  12:01 AM             5,811 DI356A~S.TXT ddmget-output.txt
01/23/2009  01:03 PM           313,880 DLA94Q~K.TXT ddm-log-fn.txt
04/20/2010  07:42 PM             7,491 A50QZP~A.TXT april-20-2010.txt