C程序:判断文件在哪个目录
C program: determine which directory a file is in
确定文件所在目录的好方法是什么?我会使用 realpath(),但是 return 是符号链接指向的文件或目录的绝对路径。
例如,如果参数是文件的基本名称,并且 lstat() returns 0,我可以确认该文件存在。但是出于我正在处理的程序的目的,我需要确定该文件所在的目录。
该项目在 GH 上,所以如果它有助于回答问题,我不介意在这里发布代码。谢谢!
更新:这里有一些细节:
代码接近 L64。如果文件、目录或符号链接在.local/share/Trash.test/files/,我需要在.local/share/Trash.test/中找到对应的trashinfo文件信息/.trashinfo。通常我在 files/ 处截断 return 值 realpath(),然后附加信息/,然后附加基本名称和 .trashinfo 分机。在那之后,它做我需要的。但是当我尝试获取符号链接的真实路径时,它的绝对路径是 returned,但它是符号链接指向的路径(例如 /home/andy/temp/.local/share/Trash.test/files/dnsmasq
-> /usr/share/doc/dnsmasq
不,realpath()
不是 return 符号链接指向的文件或目录的绝对路径。 realpath()
returns 给定相对路径的现有文件的绝对路径,作为一个额外的好处,如果符号链接涉及到相对路径,那么符号链接将被解析。
当前目录中的普通文件名也是相对路径。所以,realpath()
就是你需要的功能。
另外:为什么不在发布问题之前尝试一下?
"which directory hold this file"的问题没有明确的答案。在类 unix 文件系统中,任意数量的目录中可以有任意数量的文件名,这些文件名都引用完全相同的文件(硬链接)。
甚至 realpath
只说它会给你 一个 引用文件的完全限定路径名。
这就是我解决问题的方法。
这会进行一些边界检查。与问题无关(我发现我需要再添加一两个检查)。
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);
现在可以找到信息文件的路径了,这是我们想要的结果。
很抱歉我的问题不清楚,也没有提供足够的细节来正确说明我的目标。我会在未来写出更好的问题。感谢所有花时间给我反馈的人。
确定文件所在目录的好方法是什么?我会使用 realpath(),但是 return 是符号链接指向的文件或目录的绝对路径。
例如,如果参数是文件的基本名称,并且 lstat() returns 0,我可以确认该文件存在。但是出于我正在处理的程序的目的,我需要确定该文件所在的目录。
该项目在 GH 上,所以如果它有助于回答问题,我不介意在这里发布代码。谢谢!
更新:这里有一些细节:
代码接近 L64。如果文件、目录或符号链接在.local/share/Trash.test/files/,我需要在.local/share/Trash.test/中找到对应的trashinfo文件信息/.trashinfo。通常我在 files/ 处截断 return 值 realpath(),然后附加信息/,然后附加基本名称和 .trashinfo 分机。在那之后,它做我需要的。但是当我尝试获取符号链接的真实路径时,它的绝对路径是 returned,但它是符号链接指向的路径(例如 /home/andy/temp/.local/share/Trash.test/files/dnsmasq
-> /usr/share/doc/dnsmasq
不,realpath()
不是 return 符号链接指向的文件或目录的绝对路径。 realpath()
returns 给定相对路径的现有文件的绝对路径,作为一个额外的好处,如果符号链接涉及到相对路径,那么符号链接将被解析。
当前目录中的普通文件名也是相对路径。所以,realpath()
就是你需要的功能。
另外:为什么不在发布问题之前尝试一下?
"which directory hold this file"的问题没有明确的答案。在类 unix 文件系统中,任意数量的目录中可以有任意数量的文件名,这些文件名都引用完全相同的文件(硬链接)。
甚至 realpath
只说它会给你 一个 引用文件的完全限定路径名。
这就是我解决问题的方法。
这会进行一些边界检查。与问题无关(我发现我需要再添加一两个检查)。
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);
现在可以找到信息文件的路径了,这是我们想要的结果。 很抱歉我的问题不清楚,也没有提供足够的细节来正确说明我的目标。我会在未来写出更好的问题。感谢所有花时间给我反馈的人。