Ранее в 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 должен обязательно существовать на диске, иначе у функции будет ошибка выполнения. Дело в том, что короткое имя получаемое в данном случае готовится по определенным правилам и в этих правилах сказано, что имя зависит от других коротких имен.
Давайте посмотрим правила формирования коротких имен.