00001 <?php
00013 class FbScanDir
00014 {
00015 private $dirList_ = Array();
00016 private $fileList_ = Array();
00017 private $l10n_;
00023 public function __construct($dir) {
00024
00025 if (!is_dir($dir))
00026 throw new ExceptionNotFound($dir);
00027
00028
00029 $this->l10n_ = new L10n;
00030
00031
00032 $scanList = scandir($dir);
00033 array_shift($scanList);
00034 array_shift($scanList);
00035
00036
00037 foreach ($scanList as $current) {
00038 $file = $dir.'/'.$current;
00039 $size = filesize($file);
00040 $mtime = filemtime($file);
00041 if (is_dir($file)) {
00042 $this->dirList_ []= Array(
00043 'name' => $current,
00044 'mtime' => $mtime);
00045 } else {
00046 $this->fileList_ []= Array(
00047 'name' => $current,
00048 'size' => $size,
00049 'mtime' => $mtime);
00050 }
00051 }
00052
00053
00054 $this->handleSortRequest();
00055 $this->sort();
00056 }
00061 public function setLocale($l10n) {
00062 $this->l10n_ = $l10n;
00063 }
00068 public function currentSort() {
00069 return $_SESSION['fbSort'];
00070 }
00075 public function sortLinkArray() {
00076 $l10n = $this->l10n_;
00077 $sort = Array(
00078 'name' => 'N',
00079 'size' => 'S',
00080 'mtime' => 'M');
00081 foreach ($sort as $field => $cap) {
00082 $bSortAsc = (bool)($this->currentSort() == $cap);
00083 $bSort = str_replace('-', '', $this->currentSort()) == $cap;
00084
00085 $href = '?sort='.($bSortAsc?'-':'').$cap;
00086 $text = $l10n->tr($bSortAsc?'Descending':'Ascending');
00087 $img = $alt = null;
00088 if ($bSort) {
00089 $img = ($bSortAsc)?'/s_asc.png':'/s_desc.png';
00090 $alt = $l10n->tr($bSortAsc?'Ascending':'Descending');
00091 }
00092 $sort[$field] = Array(
00093 'href' => $href,
00094 'text' => $text,
00095 'img' => $img,
00096 'alt' => $alt);
00097 }
00098 return $sort;
00099 }
00104 private function handleSortRequest() {
00105 session_start();
00106 session_register('fbSort');
00107 if (isset($_GET['sort'])) {
00108 $sortRq = strtoupper($_GET['sort']);
00109 switch ($sortRq) {
00110 case 'N':
00111 case 'S':
00112 case 'M':
00113 case '-N':
00114 case '-S':
00115 case '-M':
00116 $_SESSION['fbSort'] = $sortRq;
00117 }
00118 }
00119 if (!isset($_SESSION['fbSort']))
00120 $_SESSION['fbSort'] = 'N';
00121 }
00125 private function sort() {
00126 $sort = strtoupper($this->currentSort());
00127 $dirSort = $fileSort = '';
00128 switch ($sort) {
00129 case '+N': case 'N':
00130 $dirSort = $fileSort = 'FbScanDir_cmpName';
00131 break;
00132 case '-N':
00133 $dirSort = $fileSort = 'FbScanDir_cmpNameD';
00134 break;
00135 case '+S': case 'S':
00136 $dirSort = 'FbScanDir_cmpName';
00137 $fileSort = 'FbScanDir_cmpSize';
00138 break;
00139 case '-S':
00140 $dirSort = 'FbScanDir_cmpName';
00141 $fileSort = 'FbScanDir_cmpSizeD';
00142 break;
00143 case '+M': case 'M':
00144 $dirSort = $fileSort = 'FbScanDir_cmpMtime';
00145 break;
00146 case '-M':
00147 $dirSort = $fileSort = 'FbScanDir_cmpMtimeD';
00148 break;
00149 }
00150 usort($this->dirList_, $dirSort);
00151 usort($this->fileList_, $fileSort);
00152 }
00153
00161 public function dirList() {
00162 return $this->dirList_;
00163 }
00164
00173 public function fileList() {
00174 return $this->fileList_;
00175 }
00176
00182 public static function sizeToString($countOfBytes) {
00183 if ($countOfBytes<1024)
00184 return sprintf('%d B', $countOfBytes);
00185 $size = (float)$countOfBytes;
00186 $size /= 1024;
00187 if ($size<1024)
00188 return sprintf('%.1f KB', $size);
00189 $size /= 1024;
00190 if ($size<1024)
00191 return sprintf('%.1f MB', $size);
00192 else
00193 return sprintf('%.1f GB', $size/1024);
00194 }
00195
00201 public static function mtimeToString($timeStamp) {
00202 return date('Y-m-d H:i', $timeStamp);
00203 }
00204
00210 public static function mtimeDateToString($timeStamp) {
00211 return date('Y-m-d', $timeStamp);
00212 }
00213
00219 public static function mtimeTimeToString($timeStamp) {
00220 return date('H:i', $timeStamp);
00221 }
00222 }
00223
00224
00225 function FbScanDir_intCmp($a, $b) {
00226 if ($a>$b)
00227 return 1;
00228 else if ($b>$a)
00229 return -1;
00230 else
00231 return 0;
00232 }
00233 function FbScanDir_cmpName($a, $b) {
00234 return strcmp($a['name'], $b['name']);
00235 }
00236 function FbScanDir_cmpNameD($a, $b) {
00237 return strcmp($b['name'], $a['name']);
00238 }
00239 function FbScanDir_cmpSize($a, $b) {
00240 return FbScanDir_intCmp($a['size'], $b['size']);
00241 }
00242 function FbScanDir_cmpSizeD($a, $b) {
00243 return FbScanDir_intCmp($b['size'], $a['size']);
00244 }
00245 function FbScanDir_cmpMtime($a, $b) {
00246 return FbScanDir_intCmp($a['mtime'], $b['mtime']);
00247 }
00248 function FbScanDir_cmpMtimeD($a, $b) {
00249 return FbScanDir_intCmp($b['mtime'], $a['mtime']);
00250 }
00251 ?>