Как сравнить два (абсолютных) пути (заданных как char *) в C и проверить, совпадают ли они? - PullRequest
3 голосов
/ 13 июня 2019

Учитывая два пути как char *, я не могу определить, указывают ли эти два пути на один и тот же файл.Как реализовать в C независимую от платформы утилиту, чтобы проверить, указывают ли пути на один и тот же файл.

Использование strcmp не будет работать, потому что в Windows пути могут содержать \ или / Использование ist_ino не поможет, потому что этоне работает на windows

    char *fileName = du->getFileName();
    char *oldFileName = m_duPtr->getFileName();
    bool isSameFile = pathCompare(fileName, oldFileName) == 0;//(strcmp(fileName, oldFileName) == 0);
    if (isSameFile){
        stat(fileName, &pBuf);
        stat(oldFileName, &pBuf2);

        if (pBuf.st_ino == pBuf2.st_ino){
            bRet = true;
        }
    }

1 Ответ

1 голос
/ 13 июня 2019

Вы не можете. Жесткие ссылки также существуют в Windows, и в стандартной библиотеке C нет методов для их работы.

Возможные решения более крупной проблемы: создайте ссылку на cygwin1.dll и используйте метод st_ino. Вы исключили st_dev из своего примера кода и должны вернуть его обратно.

Хотя существует реальный способ сделать это в Windows, он использует методы ntdll, и мне пришлось прочитать код Cygwin, чтобы узнать, как это сделать.

Методами являются NtGetFileInformationByHandle и NtFsGetVolumeInformationNyHandle. Есть документированные вызовы kernel32, которые утверждают, что делают то же самое. Обратитесь к исходному коду cygwin, чтобы узнать, почему они не работают должным образом (глючные драйверы fs).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...