0

ファイルシステムの操作に不慣れだったことが一因です。その下のファイルのフォルダーをナビゲートするスクリプトを作成しようとしています。ファイルは現在、そのディレクトリの内容を一覧表示することで機能します (別名 ".")。以下のフォルダーの内容をリストする方法と、それを行う最良の方法に困惑しています。この目標に合わせてスクリプトをどのように修正する必要がありますか?

[コード]

// sets ordering variables
$a = $_GET['a'];

// are you allowed to delete?
if($_SESSION['delete'] == "ON") {
    $do_del = true;
    }
else {
    $do_del = false;
    }

// scandir to opendir coversion from stackoverflow.com/questions/6823489/
$files_dir = ".";
$dir_handle = opendir($files_dir);
while ($dir_temp = readdir($dir_handle)) {
    $arr_dir[] = $dir_temp;
    }
closedir($dir_handle);


// function created by "acecream" on php.net; modified to include reverse sort
function sortArray($array, $key, $reverse = false)
    {
    if(isset($array)) {
        foreach ($array as $i => $k)
            { $sort_values[$i] = $array[$i][$key]; }

        if ($reverse == true)
            { arsort ($sort_values); }
        else
            { asort ($sort_values); }
        reset ($sort_values);

        while (list ($arr_key, $arr_val) = each ($sort_values))
            { $sorted_arr[] = $array[$arr_key]; }

        return $sorted_arr;
        }
    }


foreach($arr_dir as $file)
    {
    if(!preg_match("/(_vti)|(_borders)|(_private)|(hidden)|(~_)|(\.php)/", $file) && ($file != ".") && ($file !=".."))
        {
        $full   = "$files_dir/$file";

        $name   = strval($file);
        $size   = sprintf("%u", filesize($full));
        $kind   = pathinfo($file, PATHINFO_EXTENSION); // strval(end(explode(".", $file)));
        $mtime  = filemtime($full); // modify date
        $ctime  = filectime($full); // creation date

        $arr_files[] = array($name, $size, $kind, $mtime, $ctime);
        }
    }
$arr_count = count($arr_files);

switch ($a) {
    case 1 : $arr_files = sortArray($arr_files, 0); break;
    case 2 : $arr_files = sortArray($arr_files, 0, true); break;
    case 3 : $arr_files = sortArray($arr_files, 1); break;
    case 4 : $arr_files = sortArray($arr_files, 1, true); break;
    case 5 : $arr_files = sortArray($arr_files, 2); break;
    case 6 : $arr_files = sortArray($arr_files, 2, true); break;
    case 7 : $arr_files = sortArray($arr_files, 3); break;
    case 8 : $arr_files = sortArray($arr_files, 3, true); break;
    default: $arr_files = sortArray($arr_files, 3, true); break;
    }
unset($a);

function myFileSize($value) {
    // convert raw byte site to friendlier forms
    if($value > 1000)       { $sizestr = round(($value/1024), 1) . " KB"; }
        else                { $sizestr = "$value B"; }
    if($value > 1000000)    { $sizestr = round(($value/1048576), 1) . " MB"; }
    if($value > 1000000000) { $sizestr = round(($value/1073741824), 1) . " GB"; }
    return $sizestr;
    }
function myDate($value) {
    $date = date("j M y G:i", $value);
    return $date;
    }

if($arr_count > 0)
    {
    if($do_del == true) {
        print "<form method=\"post\" action=\"./?d=delete\">\n";
        }
        print "<table>\n";
        print "     <tr>\n";
        print "         <td>File Name</td>\n";
        print "         <td>Size</td>\n";
        print "         <td>Type</td>\n";
        print "         <td>Modified</td>\n";
        print "         <td>Created</td>\n";
    if($do_del == true) {
        print "         <td>Delete?</td>\n";
        }
        print "     </tr>\n";
        print "     <tr style=\"vertical-align: middle; background-color: #fff; border: 1px solid #000;\">\n";
        print "         <td>\n";
        print "             <a href=\"./?a=1\"><img src=\"./~_arr-asc.gif\" border=\"0\"></a>\n";
        print "             <a href=\"./?a=2\"><img src=\"./~_arr-dsc.gif\" border=\"0\"></a>\n";
        print "         </td>\n";
        print "         <td>\n";
        print "             <a href=\"./?a=3\"><img src=\"./~_arr-asc.gif\" border=\"0\"></a>\n";
        print "             <a href=\"./?a=4\"><img src=\"./~_arr-dsc.gif\" border=\"0\"></a>\n";
        print "         </td>\n";                       
        print "         <td>\n";
        print "             <a href=\"./?a=5\"><img src=\"./~_arr-asc.gif\" border=\"0\"></a>\n";
        print "             <a href=\"./?a=6\"><img src=\"./~_arr-dsc.gif\" border=\"0\"></a>\n";
        print "         </td>\n";
        print "         <td>\n";
        print "             <a href=\"./?a=7\"><img src=\"./~_arr-asc.gif\" border=\"0\"></a>\n";
        print "             <a href=\"./?a=8\"><img src=\"./~_arr-dsc.gif\" border=\"0\"></a>\n";
        print "         </td>\n";
        print "         <td>&nbsp;</td>\n";
    if($do_del == true) {
        print "         <td>&nbsp;</td>\n";
        }
        print "     </tr>\n";

    for ($beat = 0; $beat < $arr_count; $beat++)
        {
        $name   = $arr_files[$beat][0];
        $size   = $arr_files[$beat][1];
        $ext    = strtolower($arr_files[$beat][2]);
        $mdate  = $arr_files[$beat][3];
        $cdate  = $arr_files[$beat][4];

        $size   = myFileSize($size);
        $mdate  = myDate($mdate);
        $cdate  = myDate($cdate);

        // pick the image for file type based on file extension
        if(is_dir($name)) {
            $pic = "~_folder.png";
            }
        else {
            $pic = "~_file.png";
            }


        $url  = "<a href=\"$files_dir/$name\">$name</a>";   // create hard link

            print " <tr>\n";
            print "     <td style=\"width: 300px;\"><img src=\"./$pic\"> $url</td>\n";
            print "     <td style=\"width:  75px;\">$size</td>\n";
            print "     <td style=\"width:  50px;\">$ext</td>\n";
            print "     <td style=\"width: 150px;\">$mdate</td>\n";
            print "     <td style=\"width: 150px;\">$cdate</td>\n";
        if($do_del == true) {
            print "     <td><input type=\"checkbox\" name=\"list[$files_dir/$name]\" value=\"ON\"></td>\n";
            }
        print " </tr>\n";
        }
    print "</table>\n";

    if($do_del == true) {
        print " <p><input name=\"Submit1\" type=\"submit\" value=\"submit\">\n";
        print " <input name=\"Reset1\" type=\"reset\" value=\"reset\"></p>\n";
        print "</form>\n";
        }
    }
else
    {
    print "There are no files available for download.";
    }

[/コード]

4

1 に答える 1

1

スクリプトをパスを受け取る関数にします。

次に、if(is_dir($file)) 内の while ステートメントで、関数を呼び出して $file に渡します。

例えば、

function myFileSize($value) {...}
function myDate($value) {...}

function list_contents($path)
{
    $dir_name = $path;
    .
    .
    .
    $dir = opendir($path);
    .
    .
    .
    while ($file = readdir($dir)) {
        // do some stuff
        if (is_dir($file)) {
            list_contents($file);
        }
    }
}

やりたいことに応じて、再帰で動作するように list_contents() 関数の出力を変更する必要があります。配列を使用してツリー構造を生成し、後で次のようにツリーを出力できます。

// return an array representing tree structure
function list_contents($path, &$tree)
{
    // ...
    while ($file = readdir($dir)) {
        $tree[$path][] = $file;
        if (is_dir($file)) {
            list_contents($file, $tree[$path]);
        }
    }

    return $tree;
}

function print_tree($tree)
{
    // code to display array using tree structure
}

$path = '.';
$dir_name = $path;

$tree_array = array();
$tree = list_contents($path, $tree_array)

print_tree($tree);

または、メソッドのレベル数をカウントする変数を追加できます

function list_contents($path, $level = 0)
{
    //...
    // indent output text by $level number of tabs
    while($file = readdir($dir) {
        if (is_dir($file)) {
            list_contents($file, $level++)
        }
    }
}

list_contents($path);

出力は次のようになります

> Root
    > Folder1 in root
    > Folder2 in root
        > Folder1 in Folder2
        > Folder2 in Folder2
    > Folder3 in root
        > Folder1 in Folder3
              > Folder1 in Folder1/Folder3
        > File1 in Folder1
    > File1 in root
    > File2 in root

提案として、ファイル情報の取得またはファイルの操作に関連する関数を取り、それらを独自のファイル file_functions.php に入れ、それをスクリプトの先頭に含めます。

于 2012-04-25T21:14:53.203 に答える