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