2010-06-28 1 views
0

폴더 내의 폴더 만 나열하는 스크립트를 만들려고합니다. 문제는 내가 폴더 안에 폴더를 만들 수있는 사용자가 있기 때문에 기본적으로 내가하려는 것은 사용자가 폴더를 관리하고 파일을 저장하는 방법을 갖는 것입니다. 내 문제는 내가 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; 
} 

답변

2

사용자에게 절대 경로를 제공하는 대신 지정된 기본 경로와 관련된 경로 만 지정할 수 있습니다. 그런 다음 상대 경로에 대해 "/../"를 제거하는 함수를 작성하면 안전합니다 (사용자가 서버에서 링크를 만들 수없는 한 ...).

멋지게 만들고 싶다면 ".."을 그 앞에있는 요소와 일치시킬 수 있습니다 ("a /../b"는 "b", 즉 ".."가됩니다). ") 또는 앞에"path "요소가 없으면".. "를 무시하십시오.

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 당신은 폴더에 통과하면에서 디렉토리를 나열 할 :

+0

나는 "a /../ b"가 정규식이라고 가정합니다. 그렇지? – user253530

+0

아니요, ".."은 상위 디렉토리입니다. –

0

여기에 확장 할 수있는 작은 선물입니다. $homeFolder은 가장 큰 폴더가 될 폴더를 전달하십시오. 두 경로 모두 realpath을 입력하면 절대 경로로 확인됩니다. $folderPath$homeFolder 이하이면문자열은 전체 $homeFolder 문자열로 시작하여 포함됩니다. 이 경우 glob 모든 디렉토리가 $folderPath에 있고 배열의 절대 경로가 반환됩니다.


./code/php/을 반환

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

를 수행 $homeFolder에서 $folderPath의 상대 경로를 얻으려면.


OOP로 이것을 수행하려는 경우 SPL DirectoryIterator에 관심이있을 수 있습니다.