目录列表与限制

问题描述:

我想制作一个脚本,只列出文件夹内的文件夹。问题是我的用户可以在他们的文件夹中创建文件夹,所以基本上我想要做的就是让用户管理他们的文件夹和存储文件......我的问题是我想让PHP“认为“根文件夹是他们的主目录,他们不能超过他们的主目录。目前我的php函数不能这样做,它只显示目录的内容......并且如果用户升到一个层次并且再升一级......等等......他可以浏览整个硬盘驾驶。目录列表与限制

function directoryList($path) { 
    $dirStruct = array(); 
    if(is_dir($path)) { 
     $handle = opendir($path); 
     while(($file = readdir($handle)) !== false) { 
      if(@opendir($path.$file)) { 
       chdir($path.$file); 
       $absolutepath = getcwd(); 
       $dirStruct[] = array('path' => $absolutepath.'\\', 'name'=>$file); 
      } 
     } 
    } 
    return $dirStruct; 
} 

而不是给用户一个绝对路径,只允许它们指定相对于给定基路径的路径。接下来,编写一个函数,删除相对路径的任何“/../”,并且您是安全的(只要用户无法在服务器上创建链接...)。

如果你想要很好,你可以匹配“..”和之前的元素(所以“a /../ b”会变成“b”,即“..”删除“a” “)或者如果在它之前没有路径元素,则忽略”..“。

+0

我假设“a /../ b”是一个正则表达式。是吗? – user253530 2010-06-28 16:07:15

+0

不,“..”是父目录。 – 2010-06-29 07:09:36

这里是一个小东西,以扩大:你的文件夹中传递你想从列出的目录

function listFolders($folderPath, $homeFolder) 
{ 
    $folderPath = realpath($folderPath); 
    $homeFolder = realpath($homeFolder); 
    if(strpos($folderPath, $homeFolder) === 0) { 
     return glob("$folderPath/*", GLOB_ONLYDIR); 
    } 
} 

$dirs = listFolders('/home/gordon/code/php', '/home/gordon'); 
print_r($dirs); 

$folderPath。对于$homeFolder传入您想成为最顶层文件夹的文件夹。通过realpath这两个路径,你确保它们被解析为绝对路径。如果$folderPath低于$homeFolder,那么$folderPath字符串将以字符串开始并包含整个$homeFolder字符串。如果是这种情况,我们只需glob$folderPath中的所有目录,并将它们的绝对路径返回到数组中。


要从$homeFolder得到$folderPath的相对路径,只是做

ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/'); 

这将返回./code/php/


如果你想与OOP要做到这一点,你可能会感兴趣的SPL DirectoryIterator