Для только «простой» канонизации, устраняющая использование .
и ..
, просто создать два 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.
Таким образом, вы можете сделать двухступенчатый подход:
- Проверьте с
g_file_equal()
. Если он скажет true
, все готово.
- Else запросите атрибут
G_FILE_ATTRIBUTE_ID_FILE
и сравните их.
В каком виде (эквивалентах) вы имеете в виду, здесь? В частности, как следует обращаться с символическими ссылками? – unwind
Например/home/user/file /home/user/dir/../file и файл совпадают (если $ PWD =/home/user) – shved