Шаг 19 - Long File Name (LFN)

Ранее в MS DOS для имен файлов существовало всем не безызвестное правило 8.3. В операционных системах Windows 9x, NT 4.0 есть возможность импользовать длинные имена файлов. Реализация длинных имен строится на основе FAT (File Allocation Table). В MS DOS для иинформации о файле используется одна запись. Для реализации длинных имен и совместимости с MS DOS для длинных имен файлов используется несколько записей в этой таблице. Только этим записям присваиваются следующие атрибуты.

Только чтение
Системный
Скрытый
Метка тома

При таком наборе атрибутов данные записи не видит ни одна программа как и сама MS DOS, зато хорошо различает Windows вот на этом трюке и основана совместимость с ранними версиями операционных систем. И тут возникает интересная ситуация. Для программиста в Windows все равно. Функция типа

CreateDirectory
DeleteFile
CreateFile 
OpenFile
......

Уже умеют работать с длинными именами и заботы мало. Даже старые программы для MS DOS могут работать с файлами, у которых длинные имена до тех пор пока их не:

Переименуют
Переместят

Есть функции, которые умеют преобразовывать файлы в короткие и по коротким получать длинные. Например GetLongPathName или GetShortPathName. Вот пример кода:

#include "stdafx.h"
#include "afx.h"
#include "iostream.h"

int main(int argc, char* argv[])
{
	DWORD dwResult;
	char s[256]; 
	char buffer[256];
	lstrcpy(s,"c:\\mycatalog code.txt");
	dwResult=GetShortPathName(s ,buffer,256);
	if (!dwResult) cout << "Error ";
	else cout << buffer<< endl;
	return 0;
}

А вот результат:

c:\MYCATA~1.TXT
Press any key to continue

Обратите внимание файл c:\\mycatalog code.txt должен обязательно существовать на диске, иначе у функции будет ошибка выполнения. Дело в том, что короткое имя получаемое в данном случае готовится по определенным правилам и в этих правилах сказано, что имя зависит от других коротких имен.

Давайте посмотрим правила формирования коротких имен.

  1. Все буквы становяться большими
  2. Имя - первые 6 букв, а остальное отрезается.
  3. Хвост - "~цифра", если такое имя уже есть, то цифра будет увеличиваться.
  4. Если доходим до 9, то уменьшаем количество букв и хвостик из двух знаков.
  5. Расширение - первые 3 буквы, а остальное отрезается

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.