2012-04-25 8 views
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."; 
    } 

[/コード]

答えて

1

は、スクリプトのパスに取る関数を確認します。

if while(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.pあなたのスクリプトの一番上にそれを含めてください。

関連する問題