@hatred

Как получить низкоуровневое имя файла?

Необходимо конвертировать путь к файлу из Win32 в NT

Что бы выглядело вот так:
"E:"					-> "\Device\HarddiskVolume3"
"E:\Temp"				-> "\Device\HarddiskVolume3\Temp"
"E:\Temp\transparent.jpeg"		-> "\Device\HarddiskVolume3\Temp\transparent.jpeg"
"I:\foto.jpg"			-> "\Device\Harddisk1\DP(1)0-0+6\foto.jpg"
"P:\Data\Passwords.txt"		-> "\Device\TrueCryptVolumeP\Data\Passwords.txt"
"A:\Autoexec.bat"			-> "\Device\Floppy0\Autoexec.bat"
"H:\VIDEO_TS\VTS_01_0.VOB"		-> "\Device\CdRom1\VIDEO_TS\VTS_01_0.VOB"
"COM1"				-> "\Device\Serial1"
"COM4"				-> "\Device\USBSER000"
"\\ComputerName\C$\Boot.ini"		-> "\Device\Mup\ComputerName\C$\Boot.ini"
"\\ComputerName\C$\Boot.ini"		-> "\Device\LanmanRedirector\ComputerName\C$\Boot.ini"
"\\ComputerName\Shares\Dance.m3u"	-> "\Device\LanmanRedirector\ComputerName\Shares\Dance.m3u"


Про функции типа GetFinalPathNameByHandle я знаю, они не подходят по одной причине: файлуа может и не существовать поэтому открыть и получить его хэндл используя CreateFile не получится.

Есть ли ещё функции WinAPI (с поддержкой Vista и выше) для конверсии пути из Win32 в NT?
  • Вопрос задан
  • 187 просмотров
Пригласить эксперта
Ответы на вопрос 2
@nirvimel
Если файла не существует, то и не существует однозначно соответствующего ему внутреннего имени (FinalPath). В вашем примере как раз хорошо проиллюстрирован этот случай с COM1 и COM4, которым сопоставлены совершенно разные устройства. Какому устройству будет сопоставлено имя COM2 зависит от самих устройств (в том числе еще не подключенных на данный момент) и иногда даже от порядка их подключения.

Это в общем случае... Но в частном случае может подойти такое решение: получить внутреннее имя (FinalPath) для каталога, в котором должен находиться несуществующий файл и через разделитель дописать к нему имя этого файла.
Ответ написан
Комментировать
@hatred Автор вопроса
@nirvimel
пытаюсь воплотить эту идею, но тут возника ошибка.

путаюсь открыть сетевую папку:
CreateFile ("\\192.168.1.2", GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);

// Выдаёт ошибку: 161 (The specified path is invalid.)


Причём для путей C:, D:, E: всё работает и открывается без ошибок.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы