我正在尝试检查路径是否比当前目录指向“上”。范例:
我在里面 "./"
假设当前目录包含一个名为“文件夹”的文件夹
我想检查是否cd "./folder/../../"
会将我引到“ ./”之外。在这种情况下,它将回答我是对的。
这是将我的程序绑定到其执行文件夹(我希望它执行ls,但绝不在外部)。
POSIX.1-2001定义了realpath(3):
#include <limits.h> #include <stdlib.h> char *realpath(const char *path, char *resolved_path);
realpath()
扩展所有的符号链接,并做出决议参考/./
,/../
并额外'/'
由路径命名产生规范化的绝对路径名的空值终止字符串中的字符。生成的路径名以NULL终止的字符串形式存储,最大为PATH_MAX
字节,存储在指向的缓冲区中resolved_path
。结果路径将没有符号链接/./
或/../
组件。
您可以将规范化路径与当前目录进行比较,看看前者是否为后者的后代。
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
bool is_inside(const char *parent, const char *child) {
char *abs_parent = realpath(parent, NULL);
if (!abs_parent) { perror(parent); exit(EXIT_FAILURE); }
char *abs_child = realpath(child, NULL);
if (!abs_child) { perror(child); exit(EXIT_FAILURE); }
size_t parent_len = strlen(abs_parent);
size_t child_len = strlen(abs_child);
bool result = strncmp(abs_parent, abs_child, parent_len) == 0 &&
(child_len == parent_len || abs_child[parent_len] == '/');
free(abs_parent);
free(abs_child);
return result;
}
int main(int argc, char **argv) {
if (argc != 3) {
fprintf(stderr, "usage: %s <parent> <child>\n", argv[0]);
return 1;
}
printf("%s\n", is_inside(argv[1], argv[2]) ? "yes" : "no");
return 0;
}
请注意,这仅在路径存在的情况下有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句