LinuxForum.Fans
Тема

Как узнать полный путь к файлу по его имени?

Автор: c-villain 31 сообщений 14165 просмотров
#135826
c-villain написал:
или этот файл == команда

нет... исклбючительно файл..

#135829
c-villain написал:
оО... т.е. получить сначала айнод самого файла... а потом, начиная с корня, обходить все директории и получить айноды всех файлов в директориях и сравнивать его с исходным айнодом?.. типа если совпал - значит нашлась директория...
омг...

ага. команда find именно так и делает.
причём без инодов. просто имя. инод нужен лишь для того, что-бы найти именно ЭТОТ файл. но вы его не получите командой stat. когда вы пишете stat file_name на самом деле путь известен - если имя начинается не со слеша, то это текущий путь. текущий путь каждой конкретной программе доступен в переменной $PWD. Может ваша задача - найти текущий путь?

#135830
c-villain написал:
оО... т.е. получить сначала айнод самого файла... а потом, начиная с корня, обходить все директории и получить айноды всех файлов в директориях и сравнивать его с исходным айнодом?.. типа если совпал - значит нашлась директория...
омг...

не сверху вниз, а снизу вверх, пока не упрешься в корень.
c-villain, что на входе должна получать функция? путь до файла, указатель?

#135833
3axapp написал:
не сверху вниз, а снизу вверх, пока не упрешься в корень.

если известно только имя, то сверху вниз, от корня к листам.

3axapp написал:
что на входе должна получать функция? путь до файла, указатель?

тут речь про ядро, а не про программу. в ядре это всё не работает. там нет понятия "пользователь". а текущий путь привязан к программе, а программа - к пользователю. а ещё сама программа может изменить свой текущий путь.

#135834
drBatty написал:
Может ваша задача - найти текущий путь?

в смысле текущую директорию? то нет... исключительно полный путь...

3axapp написал:
что на входе должна получать функция? путь до файла, указатель?

путь до файла... обычный формат: "\home\user\ и т.д. и т.п."

3axapp написал:
не сверху вниз, а снизу вверх, пока не упрешься в корень.

какие-то примеры кода есть?

#135835
drBatty написал:
а ещё сама программа может изменить свой текущий путь.

Вот именно.... в этом и проблема собственно возникла... или прога пишет полный путь, тогда все работает как надо.... но чаще всего она пишет просто название файла... вот тут и нужен как раз полный путь...

#135836
drBatty написал:
если известно только имя, то сверху вниз, от корня к листам.

какие-то ссылки на код имеются? заранее спасибо=)

#135843
drBatty написал:
тут речь про ядро, а не про программу. в ядре это всё не работает. там нет понятия "пользователь". а текущий путь привязан к программе, а программа - к пользователю. а ещё сама программа может изменить свой текущий путь.

хм для меня это темный лес) сервер,хакер,ядро-херня какая-то)

drBatty написал:
и каталога "две точки" тоже.. Так вы сможете рекурсивно распутать весь полный путь.
до корня, где как известно две точки равны одной. а вот спец-функции я не нашёл...

ну так вроде и получается снизу(от файла) вверх(к корню).

c-villain написал:
путь до файла... обычный формат: "\home\user\ и т.д. и т.п."

че-то я совсем запутался... Можно при передаче пути к файлу проверять его на соответствие относительному или полному пути(по наличию "/"), если относительный переделываем в абсолютный путем добавления текущего каталога к относительному пути. Можно еще этот путь отдать в realpath(), чтоб убрал всякие "../","./". Но это надо делать сразу при получении, а то как сказал drBatty, если смениться текущий каталог, то смысла высчитывать его после не будет.
Вообщем drBatty, наверно посоветовал единственный верный путь.

#135845
3axapp написал:
наверно посоветовал единственный верный путь.

угу... гугл тоже мне темную сторону силы не открыл...
а вот код бы желательно увидеть...

#135867
c-villain написал:
но чаще всего она пишет просто название файла... вот тут и нужен как раз полный путь...

1) если пути нет, то считается - текущий каталог.
2) функцией readdir от "." ищите там файл ".."
3) файл ".." каталог верхнего уровня. если это корень - всё.
4) если не корень, читаете его функцией readdir, узнаёте имя нижнего каталога по иноду, и узнаёте инод каталога "../.."
5) goto 3
пример как юзать функции http://linuxforum.ru/viewtopic.php?pid=152060#p152060
только я там "забыл" closedir.

ситуацию "путь есть, но кривой" - сами. там просто.

#135868
c-villain написал:
гугл тоже мне темную сторону силы не открыл...

есть там. мне лень искать или писать самому. и у меня есть. тоже лениво искать. самим не написать? я вам всё необходимое дал.
и набросок алгоритма http://linuxforum.ru/viewtopic.php?pid=152132#p152132
и даже примеры.

Войдите или зарегистрируйтесь, чтобы ответить.