Подтвердить что ты не робот

Каков наилучший способ определения того, что два пути к файлу относятся к одному и тому же файлу?

Я хочу написать unit test, который проверяет, что два пути к файлам эквивалентны, но я не хочу предполагать, что строковое представление одинаковое.

Например, в Linux могут быть символические ссылки на пути в одном случае, а не в другом. В Windows может быть обозначение диска на одном (X:\foo) и сетевом обозначении на другом (//serverX/foo). И самое сложное: файл, возможно, был написан в Linux на NFS share (в синтаксисе /path/to/file) и проверен в Windows с использованием синтаксиса DOS (X:\to\file), где X: - монтирование NFS до /path.

Некоторые идеи (найдены здесь в Stack Overflow, но не унифицированы):

  • В Linux сравните индексный дескриптор stat
  • Используйте realpath (эта платформа независима?)
  • В Windows сравните строки на GetFullPathName
  • В Windows сравните серийные номера и индекс файла с GetFileInformationByHandle

Каким будет лучшее межплатформенное решение? Я пишу это на С++, но я могу спуститься к C, очевидно.

4b9b3361

Ответ 1

Вы можете проверить библиотеку Boost.Filesystem. В частности, существует метод equivalent, который, как представляется, делает именно то, что вы ищете:

using namespace boost::filesystem;

path p("/path/to/file/one");
path q("/sym_link/to/one");
assert(equivalent(p, q));