(cpp, Windows) Что значит этот код?
// check that one path is symbolic link to another one
bool tefCheckSymbolicLink(LPCTSTR pFistPath, LPCTSTR pSecondPath)
{
_ _ bool isSymLink = false;
_ _ HANDLE hSource = ::CreateFile(pFistPath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
_ _ HANDLE hDest = ::CreateFile(pSecondPath, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
_ _ if (INVALID_HANDLE_VALUE != hSource && INVALID_HANDLE_VALUE != hDest)
_ _ {
_ __ _ BY_HANDLE_FILE_INFORMATION infoSource;
_ __ _ BY_HANDLE_FILE_INFORMATION infoDest;
_ __ _ if (::GetFileInformationByHandle(hSource, &infoSource) && ::GetFileInformationByHandle(hSource, &infoDest))
_ _ _ _{
_ _ _ __ _ if (infoSource.dwVolumeSerialNumber == infoDest.dwVolumeSerialNumber &&
_ _ _ _ _ _ _ _ infoSource.nFileIndexLow == infoDest.nFileIndexLow &&
_ _ _ _ _ _
_ _ infoSource.nFileIndexHigh == infoDest.nFileIndexHigh)
_ _ _ _ _ _{
_ _ _ _ _ _ _ _ // File already exists in the destination because source and destination are symlinks.
_ _ _ _ _ _ _ _ isSymLink = true;
_ _ _ _ _ _}
_ _ _ _ }
_ _ }
_ _ ::CloseHandle(hSource);
_ _ ::CloseHandle(hDest);
_ _ return isSymLink;
}
То что два раза hSource - это похоже лажа. (или нет?)
Но если я меняю второе место на hDest, то я никогда не попадаю (дебагером проверял) на isSymLink=true, даже если второй файл есть точная копия первого (только в разных папках), даже когда оба являются *.lnk (ссылаются на один и тот же файл).
даже когда оба являются *.lnk (ссылаются на один и тот же файл)
------
Хммм... Начни с создания symbolic link:
https://serverfault.com/questions/75397/how-do-you-create-...
Как же меня бесит нотация Йоды, которая здесь ни к селу ни к городу вообще...
Автор кода неадекватен.
меня кстати тоже бесит, т.к. это противоречит нормальному человеческому мышлению. Люди так не думают.
Однако автора именно этого кода я знаю (он уволился несколько лет назад) - весьма сильный удаленный программер из России.
И на старуху бывает проруха. Во-первых, копипаст-ошибка в коде. Во-вторых, язык Йоды там, где он ну вообще не оправдан. По задумке он применяется только при операции "равно", чтобы обезопаситься от случайного присваивания. Но "не равно"-то тут причем?
современные IDE и статические анализаторы кода ловят
-----
Ну а мы скобочки добавим - С/С++ против них ничего не имеет - любой анализатор все в скобочках и пропустит...
С/С++ допускают произвольное выражение в качестве условия - в них есть смысл в Ёдовской нотации.
В шарпе уже требуется выражение с булевым результатом - вот там меня Ёдовская нотация поражает.
кто в блокноте код пишет.
-----
Ну Я, например, пишу. Не часто, но приходится.
Просто на продактион-сервер не имею права ничего ставить, а некоторые мелочи сделаны по-разному у меня на девевелопменте и на продактионе. И проще всего - в Блокноте поправить...
Кстати, после генерации - тоже проще посмотреть что интересует именно в Блокноте... Ну или в Нотепаде++...
Не знаю, что там за скобочки у тебя хитрые, а нормальные статические анализаторы находят и не такие вещи.
И это понятно, что в шараш-монтаж конторах такие спецы типа тебя на продакшене в блокноте код правят.
А я имел в виду настоящую разработку ПО.
по-мойму лучше иногда натыкаться на ошибки и их исправлять, чем постоянно смотреть код что мозги выкручивает.
Второй случай как раз провоцирует идейные ошибки (а не опечатки), т.к. анализ такого кода труднее для понимания и сопровождения, требует больше сил, ведет к усталости и тд.
лучше иногда натыкаться на ошибки
-----
Натыкаться - это... хорошо.
Правда на именно эти ошибки практически никогда не натыкаешься - глюк вылезает непонятно где...
Что до мозговорота с Ёдовской нотацией - у меня тоже от нее голова болит.
Так что если требуют - делаю. Выглядит во многих случаях более чем смешно - требования оформления констант часто не позволяют различать что именно используется,
Для себя - нет, но комментирую факт использования присопа. Если нет коммента - должно быть сравнение. Так и живем...