본문

php에서 디렉토리 읽어서 목록을 xml로 출력하기

이전의 "nginx의 Autoindex페이지를 파싱하여 xml로 출력하기" 게시물에 이어서 이번에는 일반적인 php 환경에서 디렉토리 내부의 항목들의 목록을 xml의 형태로 출력하는 게시물을 작성한다. 출력은 거의 차이가 없지만 차이가 있다면, 이전 게시물에서는 날짜와 시간을 분리하여 출력했지만 이번에는 귀차니즘으로 인해 두개를 분리하지 않고 하나의 time이라는 항목으로 지정해주었다는것 정도? 활용은 마찬가지로 dir.php?dir=Converted/Jazz 등의 방식으로 사용하면 된다. 참고로 코어부분은 php.net의 readdir 매뉴얼 페이지의 댓글을 도입하였다.


[그림 1, 2] 파일/디렉토리 목록을 xml로 변환한 모습.(사진은 이전 게시물과 동일)

\
<?
header("Content-type: text/xml; charset=utf-8");
$dir=$_GET[dir];

function dir_list($dir)
{
    if ($dir[strlen($dir)-1] != '/') $dir .= '/';
    if (!is_dir($dir)) return array();

    $dir_handle  = opendir($dir);
    $dir_objects = array();
    while ($object = readdir($dir_handle))
        if (!in_array($object, array('.','..')))
        {
            $filename    = $dir . $object;
            $file_object = array(
                                    'name' => $object,
                                    'size' => filesize($filename),
                                    'type' => filetype($filename),
                                    'time' => date("d-M-Y H:i", filemtime($filename))
                                );
            $dir_objects[] = $file_object;
        }
 
    return $dir_objects;
}

echo "<?xml version=\"1.0\"?>\n<root dir=\"$dir\">\n";
foreach (dir_list($dir) as $entry)
{
    echo "\t<entry type=\"$entry[type]\">\n";
    echo "\t\t<href><![CDATA[".rawurlencode($entry[name])."]]></href>\n";
    echo "\t\t<text><![CDATA[".iconv("CP949", "UTF-8", $entry[name])."]]></text>\n";
    echo "\t\t<time>$entry[time]</time>\n";
    if($entry[type]=='dir') echo "\t\t<attr>-</attr>\n";
    else if($entry[type]=='file') echo "\t\t<attr>$entry[size]</attr>\n";
    echo "\t</entry>\n";
}
echo "</root>";
?>

댓글 2

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.