Как отметил Джек в своем ответе, короткое имя присваивается при создании файла (или переименовании, или перемещении). Значение зависит как от длинного имени файла, так и от того, какие другие короткие имена уже существуют.
Точный алгоритм назначения короткого имени не документирован, и нет гарантии, что алгоритм останется постоянным между версиями Windows или даже между различными форматами систем хранения. Вы не должны писать код, который зависит от какого-либо конкретного алгоритма назначения коротких имен.
Существуют как ограничения дизайна, так и ошибки, возникающие из-за коротких имен файлов. Пример ограничения дизайна:del *.txt
может удалить файл с именем something.txt2
поскольку расширение короткого имени, вероятно, будет .txt
, а исходные маски будут рассматривать как длинные, так и короткие имена. См. Раздел «BUG - короткие имена файлов 8.3 могут нарушать параметры /D и /S» в разделе. Что такое недокументированные функции и ограничения команды Windows FINDSTR? для примера ошибки, возникающей из коротких имен.
В томах NTFS могут быть отключены короткие имена файлов (короткие имена, которые существовали до их отключения, останутся). Многие люди (организации) отключают короткие имена в своей системе из-за проблем, которые они могут вызвать.
Обновить
Вот окончательный аргумент о том, почему пытаться установить алгоритм генерации коротких имен файлов - пустая трата времени - FSUTIL позволяет вам указать любое короткое имя для файла, если оно еще не существует в этом папка.
Вот соответствующая справочная документация FSUTIL
C:\test>fsutil file
---- FILE Commands Supported ----
findbysid Find a file by security identifier
queryallocranges Query the allocated ranges for a file
setshortname Set the short name for a file
setvaliddata Set the valid data length for a file
setzerodata Set the zero data for a file
createnew Creates a new file of a specified size
queryfileid Queries the file ID of the specified file
queryfilenamebyid Displays a random link name for the file ID
C:\test>fsutil file setshortname /?
Usage : fsutil file setshortname <filename> <shortname>
Eg : fsutil file setshortname C:\testfile.txt testfile