在我的代码中,我扫描输入文件,然后将其作为函数的参数传递。是否有一个函数可以用来获取文件的路径名?唯一允许的输入是文件名。
答案 0 :(得分:-1)
不是,文件可以有多个名称,系统不会维护(一旦文件打开)用于打开它的路径。在这种情况下,唯一确定用于打开文件的名称是不明确的,因此不做任何规定。
实际上,文件都没有办法知道它属于哪个目录,因为几个目录可以链接到文件,因此文件的路径可以是多个,因此,尝试解码哪个是使用的路径打开它是不可行的。
假设您有一个正在使用当前工作目录/etc
执行的进程。您可以使用多个不同的路径打开文件/etc/passwd
,例如,其中任何一个都会打开示例流程的文件:
open("/etc/passwd", ...);
open("passwd", ...);
open("./passwd", ...);
open("default/../passwd", ...);
open("/../../../etc/passwd", ...);
等...
如果您不仅需要文件的文件描述符,还需要用于打开的名称,只需将两者都传递给函数。
如果进程从其父进程继承了当前工作目录,则无法知道父进程如何到达该目录(使用的路径),因此对文件的绝对路径的引用将永远丢失。由于存在符号链接,因此也可以确定目录的路径。
使用相对路径打开的文件是相对于当前目录的,该目录是一个进程属性,仅由内核维护,作为对inode的引用,因此用于获取此类目录的路径对于进程是未知的。确实可以知道目录的路径,因为每个目录都有一个..
条目指向它的父目录,依此类推root,其..
指向自己。
以这种方式确定目录的路径是一项昂贵的操作,需要访问父目录并在该目录中搜索其inode编号与实际目录inode编号相同的条目,依此类推,直到我们开始重复inode号(对于根目录)
由于当前目录是从进程父进程继承的,因此可以在文件打开后进行更改,因此,您可能已经丢失了与您拥有的路径(用于打开文件的路径)之间的任何关系,可能是当您开始执行时,父进程)和您继承的目录。
答案 1 :(得分:-2)
请记住,程序从某个目录运行。只需获取当前工作目录即可为您提供路径。
{{1}}