_stat32i64 и Symbolic Links
От: Vaynamond Россия  
Дата: 14.02.20 12:54
Оценка:
Гуру, подскажи, плз.
Столкнулся с такой проблемкой. Есть два каталога: "e:\Common\INBOX" и "D:\PUBLIC\INBOX", в котором INBOX является
символической ссылкой (Symbolic Links) на каталог "e:\Common\INBOX". Внутри каталога INBOX есть каталог Xml.

Если я передаю в _stat32i64 в качестве каталога "D:\PUBLIC\INBOX" или "D:\PUBLIC\INBOX\.", функция возвращает -1
и errno равно ENOENT. Казалось бы, и фиг с ним, но при этом появляется дескриптор на каталог "D:\PUBLIC" (смотрел
с помощью утилиты handle.exe из Sysinternals). Если я вызову подряд два раза для разных каталогов, будет уже два
дескриптора на "D:\PUBLIC" и т.д.

Если передать в _stat32i64 в качестве каталога "D:\PUBLIC\INBOX\Xml", функция возвращает 0 и никаких дополнительных
дескрипторов не возникает.

Если вместо Symbolic Links использовать Junction Points, дополнительные дескрипторы не создаются в любом случае.

Операционка Win7 x64, приложение консольное, 32-разрядное, собранное под MSVS 2010.
Ссылки создавал как через Far 2, так и через утилиту mklink.

Это особенности Symbolic Links на Windows, или MSVS 2010 ?
В MSDN нашел только такое замечание:

_wstat does not work with Windows Vista symbolic links. In these cases, _wstat will always report a file size of 0. _stat does work correctly with symbolic links.

но мне размер и не нужен.

Пересобрал тест на MSVS 2017 — ошибки не возникает и никаких дополнительных дескрипторов тоже.

Кажется, понял, в чём проблема: в исходнике crt\src\stat.c когда попадаем в секцию
    else if ( (findbuf.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) &&
              (findbuf.dwReserved0 == IO_REPARSE_TAG_SYMLINK) )

не закрывается дескриптор, ранее полученный с помощью FindFirstFileEx.
Отредактировано 17.02.2020 11:18 Vaynamond . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.