Как я могу построить это файловое дерево на основе того, какие файлы пользователь может просматривать? - PullRequest
0 голосов
/ 22 декабря 2010

У меня есть массив файлов, который выглядит так:

Array
(
    [0] => Array
        (
            [type] => folder
            [path] => RootFolder
        )

    [1] => Array
        (
            [type] => file
            [path] => RootFolder\error.log
        )

    [2] => Array
        (
            [type] => folder
            [path] => RootFolder\test
        )

    [3] => Array
        (
            [type] => file
            [path] => RootFolder\test\asd.txt
        )

    [4] => Array
        (
            [type] => folder
            [path] => RootFolder\test\sd
        )

    [5] => Array
        (
            [type] => file
            [path] => RootFolder\test\sd\testing.txt
        )
)

Я анализирую этот массив и создаю древовидное представление на основе глубины файлов ('/' count). Это выглядит так:

RootFolder
    - error.log
    - test
        - asd.txt
        - sd
            - testing.txt

Теперь у меня есть массив путей к файлам, которые пользователь может просматривать. Мне нужно принять этот массив во внимание при построении дерева выше. Этот массив выглядит так:

Array
(
    [0] => Array
        (
            [filePath] => RootFolder\test\sd
        )

    [1] => Array
        (
            [filePath] => RootFolder\error.log
        )

)

Было бы легко сделать if in_array($path, $allowed), но это не даст мне дерево. Просто список файлов ...

Другая часть, на которую я поставлен в тупик, - это требование: если у пользователя есть доступ для просмотра папки test, он получает доступ ко всем дочерним элементам этой папки.

Моя идея состояла в том, чтобы просто разобрать пути к файлам. Например, я бы подтвердил, что RootFolder\test\sd был каталогом, а затем создал бы дерево на основе счетчика '/'. Как я делал раньше. Затем, поскольку это каталог, я извлекаю все файлы в этом каталоге и показываю их пользователю. Однако у меня возникли проблемы с преобразованием этого в рабочий код ...

Есть идеи?

1 Ответ

0 голосов
/ 22 декабря 2010
$tree = array();
// keep one:
$permNeeded = '?'; //something you're searching for exactly
$permNeeded = array('?', '?'); // multiple allowed perms
// be carefull with octal data checking permisions!

function checkPerms($permFileHas){
    // keep one:
    return $permFileHas==$permNeeded;
    return in_array($permFileHas, $permNeeded);
}

function parseDir($dir){
    $contents = scandir($dir);
    foreach($contents as $file){
        if(in_array($file, array('.', '..')){
            continue; // skip . and ..
        }
        if(is_dir($file)){
            parseDir($file);
            continue;
        }
        if(checkPerms(fileperms($file)){
            $tree[] = $dir.DIRECTORY_SEPARATOR.$file;
        }
    }
}

parseDir('/the/dir/user/have/perms');

Это должно сработать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...