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

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

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

Fine. Кажется, он присваивает «~ #» в соответствии с датой / временем, когда я создал файл. Это правильно?

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

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 27 ноября 2008

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

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

В блогах MSDN можно найти информацию об этой теме, например:

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

5 голосов
/ 27 ноября 2008

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

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.txt") в d: \ stuff \ somefilewithlongname. txt, если есть d: \ stuff \ somefileelse.txt ("d: \ stuff \ somefi ~ 1.txt"), короткое имя перемещаемого файла будет somefi ~ 2.txt). Кажется, что короткое имя сохраняется только в указанном каталоге на данном компьютере.

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

3 голосов
/ 27 ноября 2008

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

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

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

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

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

несмотря на то, что наряду с файл_файла2.txt изначально был создан третий.

0 голосов
/ 24 июня 2011

Когда файлы предоставляются сетевым сервером, на котором работает 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
0 голосов
/ 27 ноября 2008

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

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

...