2013-06-26 2 views
0
<?php 
$dir = ''; 

if(isset($_GET['dir']) && !empty($_GET['dir']) && !stristr($_GET['dir'], '.')){ 
    $dir = '/'. $_GET['dir']; 
    echo '<a href="files.php">back to /</a><br><br>'; 
} 

foreach(scandir('files'. $dir) as $filename){ 
    if($filename == ".." || $filename == "."){ 
     // do nothing. We want files and folders, not dots. 
    } 
    else 
    { 
     if(is_file($filename)){ 
      echo '<a href="files/'. $filename .'">'. $filename .'</a><br>'; 
     } 
     else 
     { 
      echo '<a href="files.php?path='. $filename .'">'. $filename .' (dir)</a><br>'; 
     } 
    } 
} 
?> 

그래서 Windows 탐색기 (예 :!)에서 보는 것처럼 내 사이트의 파일 인덱서를 만들고 싶습니다. 그러나 스크립트는 현재 모든 파일이 색인하려는 폴더 인 files/ 디렉토리의 하나의 폴더를 감지하여 하위 폴더 내부 또는 외부에서 파일을 완전히 손실합니다. 그리고 하위 폴더를 클릭하면 기본 폴더 (files/)와 같은 역할을합니다.인덱싱 폴더 : 디렉토리를 감지하지 못합니다.

어떻게 해결할 수 있습니까?

또 다른 질문은 glob 또는 scandir을 사용해야합니까? 단지 내가 그것을에 노트처럼 memory_limit를 문제를 처리하지 않도록 ~ 80 개 파일을 포함 할 것 년대 PHP.net page :

당신이하는 디렉토리에 파일을 나열하려고하면

는 글로브()를 사용하지 마십시오 매우 많은 파일이 저장됩니다 (> 100.000). "허용 된 메모리 크기의 XYZ 바이트가 소모되었습니다 ..."오류가 발생합니다. php.ini에서 memory_limit 변수를 늘려보십시오. Mine은 128MB로 설정되어 있으며 glob()는 500.000 개가 넘는 반면 스크립트는 여전히이 제한에 도달합니다.


Barmar의 솔루션 후

업데이트 코드 :

<?php 
      $dir = ''; 

      if(isset($_GET['dir']) && !empty($_GET['dir']) && !stristr($_GET['dir'], '.')){ 
       $dir = $_GET['dir']; 
       echo '<a href="files.php">Back to /</a><br><br>'; 
      } 

      foreach(scandir('files'. $dir) as $filename){ 
       if($filename == ".." || $filename == "."){ 
        // do nothing. We want files and folders, not dots. 
       } 
       else 
       { 
        if(is_file($dir .'/'. $filename)){ 
         echo '<a href="'. $filename .'">'. $filename .'</a><br>'; 
        } 
        else 
        { 
         echo '<a href="files.php?dir='. $dir .'/'. $filename .'">'. $filename .' (dir)</a><br>'; 
        } 
       } 
      } 
     ?> 
+1

더 잘 제어하고 싶을 수 있습니다. 체크 아웃 : http://php.net/manual/en/class.recursivedirectoryiterator.php –

+0

같은 경로에 머물고있는 다른 문제를 해결하려면? path = to? dir = – tlenss

+0

@RobW 체크 아웃했습니다. ,하지만 그게 더 어려워 보인다. – Thew

답변

1

scandir 반환 파일 이름, 디렉터리 접두사를 추가 할 필요가 있도록하지 경로 이름 :

foreach(scandir('files'. $dir) as $filename){ 
    if($filename == ".." || $filename == "."){ 
     // do nothing. We want files and folders, not dots. 
    } 
    else 
    { 
     if(is_file($filename)){ 
      echo '<a href="files/'. $dir . '/' . $filename .'">'. $filename .'</a><br>'; 
     } 
     else 
     { 
      echo '<a href="files.php?dir=' . $dir . '/' . $filename .'">'. $filename .' (dir)</a><br>'; 
     } 
    } 
} 

또한 실종 된 files.php? 첫 번째 링크에서 두 번째 링크는 dir=을 사용해야합니다. 서브 디렉토리.

+0

필자는'files.php? '파일을 가지고 있기 때문에 그 디렉토리 안에있는 파일들에 대한 직접 링크가 될 수 있습니다. 이제는이를 바로 잡았고'files/folder1 /'에 넣은 더미 파일을 발견했지만 폴더로 읽습니다. 따라서'files/folder1 /'을 폴더로,'files/dummy.txt'를 폴더로,'files/folder1 /'로 갈 때'files/folder1/dummy.txt'를 폴더로도 탐지합니다 . (현재 코드로 업데이트 된 질문보기) – Thew

+0

파일의 직접 링크에 디렉토리 접두어가 필요합니다. 나는 그 사건에 대한 나의 대답을 업데이트했다. – Barmar

+0

문제점을 발견했습니다. 'is_file' 함수의 경로도 변경하는 것을 잊었습니다. '우리는 모두 인간이라고 생각해. – Thew

관련 문제