2015-04-07 2 views
26

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

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

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

  1. На Linux, сравните инод из stat
  2. Использование realpath (независимая ли это платформа?)
  3. В Windows , сравнить строки на GetFullPathName
  4. В Windows, сравнить серийные номера и индекс файла с GetFileInformationByHandle

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

+0

не уверен, если он затрагивает вашу проблему, но вы посмотрите на повышение :: Filesystem? http://www.boost.org/doc/libs/1_57_0/libs/filesystem/doc/index.htm – vsoftco

+0

@JossefHarush, который не сказал бы вам, если вы смотрите на две разные копии одного и того же файла. –

ответ

19

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

using namespace boost::filesystem; 

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

Спасибо, вот что я искал. Для справки, реализация boost использует сравнения inode в сравнении с Linux и серийными номерами/индексами файлов в Windows. –

Смежные вопросы