C程序:确定文件所在的目录

时间:2016-09-16 05:41:19

标签: c realpath

确定文件所在目录的好方法是什么?我会使用realpath(),但它返回符号链接所指向的文件或目录的绝对路径。

例如,如果参数是文件的基名,并且lstat()返回0,我可以确认该文件是否存在。但是出于我正在处理的程序的目的,我需要确定该文件所在的目录。

该项目是关于GH的,所以我不介意在这里发布代码,如果它有助于回答问题。谢谢!

更新:以下是一些细节: 代码接近L64。如果文件,目录或符号链接在.local / share / Trash.test / 文件 /中,我需要在.local / share / Trash.test / 中找到相应的trashinfo文件。信息 /。trashinfo。通常我在 files / 处截断返回值realpath(),然后追加info /,然后追加basename和.trashinfo ext。在那之后,它做我需要的。但是当我尝试获取符号链接的真实路径时,会返回它的绝对路径,但它是符号链接所指向的路径(例如/home/andy/temp/.local/share/Trash.test/files/dnsmasq - > /usr/share/doc/dnsmasq

3 个答案:

答案 0 :(得分:0)

不,realpath()不返回符号链接所指向的文件或目录的绝对路径。 realpath()返回给定相对路径的现有文件的绝对路径,作为额外的好处,如果相对路径中涉及符号链接,则将解析符号链接。

当前目录中的普通文件名也是相对路径。因此,realpath()是您需要的功能。

另外:为什么不在发帖前尝试呢?

答案 1 :(得分:0)

对于“哪个目录保存此文件”的问题没有明确的答案。在类似unix的文件系统中,任意数量的目录中都可以有任意数量的文件名,这些文件名都指向完全相同的文件(硬链接)。

realpath仅表示它会为您提供一个引用该文件的完全限定路径名。

答案 2 :(得分:0)

这就是我解决我想要做的事情。

这会进行一些边界检查。与问题无关(我看到我需要添加另外两张支票)。

  buf_check (argv[restore_request], PATH_MAX);

argv [restore_request]是要恢复的文件。这可以是绝对路径或相对路径,也可以只是一个基本名称,具体取决于当前的工作目录。

  strcpy (file.relative_path, argv[restore_request]);

  file.base_name = basename (argv[restore_request]);

这会放置一个' \ 0'在字符串中:str [strlen(str) - strlen(file.base_name)],实际上是砍掉了基本名称。

  truncate_str (file.relative_path, strlen (file.base_name));

我相信其余的行是不言自明的

  strcpy (file.info, file.relative_path);
  strcat (file.info, "../info/");
  strcat (file.info, file.base_name);
  strcat (file.info, DOT_TRASHINFO);

现在可以找到info文件的路径,这是所需的结果。 我很抱歉我的问题不明确,并没有提供足够的细节来恰当地说明我的目标。我将在未来写出更好的问题。感谢所有花时间给我反馈的人。