2013-08-21 2 views
0

Мне нужно проверить эквивалентность двух путей к файлу с помощью glib. Я сделал это с Qt давным-давно, по пути сокращения. Но я не могу найти подобные инструменты в glib. Может кто-нибудь предложить общий способ сделать это?Проверить эквивалентность пути с помощью glib

Благодаря

+0

В каком виде (эквивалентах) вы имеете в виду, здесь? В частности, как следует обращаться с символическими ссылками? – unwind

+0

Например/home/user/file /home/user/dir/../file и файл совпадают (если $ PWD =/home/user) – shved

ответ

1

Для только «простой» канонизации, устраняющая использование . и .., просто создать два GFile объектов, используя g_file_new_for_path() функции GIO API. Затем сравните два файла, используя g_file_equal().

Обратите внимание, что это зависит от GIO, выполняющего простую канонизацию путей при создании объектов GFile; он не будет разрешать символические ссылки. В документации говорится:

Использование GFile как идентификатор имеет те же недостатки, как использовать путь в том, что там может быть несколько псевдонимов для одного файла. Например, жесткие или мягкие ссылки могут приводить к тому, что два разных файла GFile s ссылаются на один и тот же файл. Другими возможными причинами для псевдонимов являются: нечувствительные к регистру файловые системы, короткие и длинные имена в FAT/NTFS или привязки в Linux. Если вы хотите проверить, указывают ли два GFile s на один и тот же файл, вы можете запросить атрибут G_FILE_ATTRIBUTE_ID_FILE. Обратите внимание, что GFile выполняет некоторую тривиальную канонизацию передаваемых путей, так что тривиальные различия в строке пути, используемые при создании (дублированные косые черты, косые черты в конце пути, «.» Или «..» и т. Д.) Не создают разных GFile s.

Таким образом, вы можете сделать двухступенчатый подход:

  1. Проверьте с g_file_equal(). Если он скажет true, все готово.
  2. Else запросите атрибут G_FILE_ATTRIBUTE_ID_FILE и сравните их.
Смежные вопросы