-1

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

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

该项目在 GH 上,所以如果它有助于回答问题,我不介意在此处发布代码。谢谢!

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

4

3 回答 3

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);

现在可以找到信息文件的路径,这是预期的结果。很抱歉我的问题不清楚,也没有提供足够的细节来正确说明我的目标。我会在未来写出更好的问题。感谢所有花时间给我反馈的人。

于 2016-09-16T19:11:00.013 回答
0

不,realpath()不返回符号链接指向的文件或目录的绝对路径。 realpath()在给定相对路径的情况下返回现有文件的绝对路径,并且作为额外的好处,如果符号链接包含在相对路径中,则将解析符号链接。

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

另外:为什么不在发布问题之前尝试一下?

于 2016-09-16T05:48:17.477 回答
0

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

甚至realpath只说它会为您提供一个引用该文件的完全限定路径名。

于 2016-09-16T05:49:16.513 回答