2015-02-27 3 views
0

Эта же запись в файловой системе может быть доступна по нескольким путям.Как получить полный полный путь к файлу или каталогу, имеющему один из его путей?

  1. реальный полный путь -/Главная/пользователь/dir1/file1
  2. путь, который содержит родительские каталоги - /home/user/dir1/../dir1/file1
  3. путь с прямые симлинки -/Главная/пользователь/dir1/symlink_to_file1
  4. путь с косвенными симлинками -/Главная/пользователь/symlink_to_dir1/file1
  5. ...

Я хочу написать две функции, которые для заданных двух путей будут определять, находится ли файл или каталог, указанный вторым путем, внутри (включая подкаталоги) каталог, указанный первым путем.

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

ПРИМЕЧАНИЕ. Я хочу написать функцию как для Windows, так и для POSIX-совместимых систем.

ПРИМЕЧАНИЕ: boost :: filesystem не может использоваться.

+0

Вы считаете жесткие ссылки? Я не думаю, что идея каталогов (или файлов), имеющих единственное «настоящее имя», имеет смысл в Linux. – unwind

+0

Это не имеет особого смысла в Windows. Однако при обычной установке Windows нет файлов с несколькими записями в каталоге (hardlinks). –

ответ

1

В Windows и Unix-land одинаковый is нет “ действительный путь ”. В частности, файл может иметь много разных записей в каталоге, называемых hardlinks, в Unix-land, созданных через ln, а также в Windows 7 и более поздних версиях через mklink. Но также в Windows вы можете очень просто определить локальный логический диск, сопоставленный с каким-либо каталогом, с помощью команды subst и диски, сопоставленные каталогам файловых серверов через, например, net use, и вы можете установить диск в качестве каталога, например. через команду mountvol.

Однако проблема “ real path ” - это просто воображаемое решение реальной проблемы, которая заключается в том, чтобы установить, находится ли файл или каталог внутри каталога, указанного через путь.

Для этого определите системный идентификатор для объекта файловой системы, который вы ищете, и отсканируйте цепочку родительских каталогов, ища этот идентификатор. Извините, я неправильно понял вопрос. Я не могу придумать какой-либо эффективный способ сделать это, это звучит как поиск идентификатора грубой силы во всех возможных каталогах, если вы не можете воспользоваться информацией индексирования.

+0

Благодарим вас за ответ. Очень жаль, что единого «реального пути» нет. Решение, которое вы предлагаете, мне не удобно, так как оно очень дорогое время (с учетом того, что поиск должен выполняться и в подкаталогах). –

0

Вопрос, который вам нужно знать, таков: сколько способов добраться до/path/to/filename? С символическими ссылками ответ бесконечен (ну, в пределах размера файловой системы). Любая символическая ссылка в любом месте любой части файловой системы может перенаправляться на файл (или на некоторую часть пути над файлом). Даже без учета жестких ссылок пространство поиска должно быть всей файловой системой в/base/path/of/interest/(что может быть всей файловой системой).

Разрешение символических ссылок и без дополнительных ограничений не существует метода не-грубой силы для установления того, доступен ли путь/путь/имя/имя файла в/base/path/of/interest /.

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