C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 19 - Long File Name (LFN) / MSDN rus / Visual C++

Шаг 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 буквы, а остальное отрезается

| |
Автор Каев Артем.
[AD]