Привет, Бойко!

Я погуглил немного. Оказывается, realpath — это ещё и системный вызов:
http://www.opennet.ru/man.shtml?topic=realpath&category=3&russian=5
http://www.opennet.ru/man.shtml?topic=realpath&category=3&russian=2

Для Windows с аналогичной функцией проблемы. Функция GetFinalPathNameByHandle 
появилась только в Windows Vista:
https://technet.microsoft.com/ru-ru/office/aa364962(v=vs.110)

В более ранних системах для похожей цели требовались пляски с отображением 
файла на память:
https://technet.microsoft.com/ru-ru/office/aa366789(v=vs.110)
http://www.vsokovikov.narod.ru/New_MSDN_API/Menage_files/obtain_name.htm

Причём я не уверен, что оба способа дают именно «каноническое» имя файла. Нужно 
экспериментировать.

Есть более универсальный путь. И POSIX, и Windows позволяют сверить на 
равенство два файла по номеру устройства и номеру файла в устройстве. На POSIX 
это системный вызов stat и поля st_dev, st_ino:
http://www.opennet.ru/man.shtml?topic=stat&category=2&russian=2

На Windows это примерный аналог stat, GetFileInformationByHandle, поля 
dwVolumeSerialNumber, nFileIndexHigh, nFileIndexLow:
https://technet.microsoft.com/ru-ru/office/aa364952(v=vs.110)
https://technet.microsoft.com/ru-ru/office/aa363788(v=vs.110)

Могут ли в системе появиться два устройства с одним dwVolumeSerialNumber — хз. 
По-моему, не могут, я вроде наблюдал такую ошибку в оснастке «Управление 
дисками».


Наверное, буду идентифицировать по устройству/индексу.


Спасибо за мысль порыться в API,
Александр Коновалов


-----Original Message-----
From: Boyko Bantchev [mailto:[email protected]] 
Sent: Friday, July 27, 2018 7:02 PM
To: [email protected]
Subject: Re: Как мне сделать динамическую загрузку модулей?

> Но вот как понять, что он уже был загружен? По пути к файлу это 
> сделать сложно. На UNIX-системах один и тот же файл может быть 
> доступен как subdir/filename, ./subdir/./././filename 
> /home/user/subdir/filename, /home//user///subdir////filename, 
> /home/otheruser/../user/otherdir/../subdir/filename и т.д. На Windows 
> ещё
> веселее: добавляются тонкости с регистром символов в именах, 
> синонимичность / и \ и текущие папки на разных дисках. Эмулировать всё 
> это слишком громоздко и тем самым некрасиво.

Привет, Александр!

Мне кажется, что полное, «каноническое» имя файла, без всяких релятивностей, 
symlinks и пр. вариаций, можно добить средствами самой о.с.  То, что в bash, 
например, делает realpath.

Ответить