Каков наилучший способ определения того, что два пути к файлу относятся к одному и тому же файлу?
Я хочу написать 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, очевидно.
Ответы
Ответ 1
Вы можете проверить библиотеку Boost.Filesystem
. В частности, существует метод equivalent
, который, как представляется, делает именно то, что вы ищете:
using namespace boost::filesystem;
path p("/path/to/file/one");
path q("/sym_link/to/one");
assert(equivalent(p, q));