我完成任务的方法是使用两个for循环和strtok。 这可能不是最C++的答案,但它的工作原理。
bool within_dir(const char* path, const char* root_dir)
{
assert(path != NULL);
assert(root_dir != NULL);
char *fname_dup, *root_dup, *token;
int root_value, path_value;
// Duplicate char arrays so strtok doesn't damage the originals
fname_dup = (char*)malloc(sizeof(char) * strlen(path) + 1);
assert(fname_dup != NULL);
bzero(fname_dup, sizeof(char) * strlen(path) +1);
strncpy (fname_dup, path, sizeof(char) * strlen(path));
root_dup = (char*)malloc(sizeof(char) * strlen(root_dir) + 1);
assert(root_dup != NULL);
bzero(root_dup, sizeof(char) * strlen(root_dir)+ 1);
strncpy(root_dup, root_dir, sizeof(char) * strlen(root_dir));
// Count root directory
for (root_value = 0, token = strtok(root_dup, "/");
token != NULL;
token = strtok(NULL, "/"))
{
if (strcmp(token, "..") == 0)
root_value--;
else
root_value++;
}
// Count and compare path value to root value
for (path_value = 0, token = strtok(fname_dup, "/");
token != NULL;
token = strtok(NULL, "/"))
{
if (strcmp(token, "..") == 0)
{
path_value--;
if (path_value < root_value)
{
free(root_dup);
free(fname_dup);
return false;
}
}
else
path_value++;
}
free(root_dup);
free(fname_dup);
return true;
}
基本上,代码贯穿并计算根的“正面”或“负面”方式。上升到一个水平是负面的,下降是积极的。一旦知道根的值,如果文件路径的值永远低于根的值,我们知道文件路径必须在根目录之上至少一层,因此是无效的。因为我们实际上并不关心实际值,所以只有当它从根目录上层时,我们立即停止并返回false。如果文件路径始终保持比根更积极的状态,那么filetree上的文件路径将始终较低。不保证链接。
所以,总而言之,你想要的东西比计数更容易* – 2014-09-30 22:50:52
我只是想知道是否有一个函数存在,在我执行它之前就做了我想要的。 – Evan 2014-09-30 22:53:01
我以为例如Apache已经这样做了? – 2014-09-30 22:55:50