我完成任務的方法是使用兩個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