XOOPS 2.5.6  Final
 All Classes Namespaces Files Functions Variables Pages
folder.php
Go to the documentation of this file.
1 <?php
55 {
62  var $path = null;
63 
70  var $sort = false;
71 
78  var $mode = '0755';
79 
86  var $messages = array();
87 
94  var $errors = false;
95 
103 
110  var $files;
111 
119  function __construct($path = false, $create = true, $mode = false)
120  {
121  if (empty($path)) {
122  $path = XOOPS_VAR_PATH . '/caches/xoops_cache';
123  }
124  if ($mode) {
125  $this->mode = intval($mode, 8);
126  }
127  if (!file_exists($path) && $create == true) {
128  $this->create($path, $this->mode);
129  }
130  if (!$this->isAbsolute($path)) {
131  $path = realpath($path);
132  }
133  $this->cd($path);
134  }
135 
136  function XoopsFolderHandler($path, $create = false, $mode = false)
137  {
138  $this->__construct($path, $create, $mode);
139  }
140 
147  function pwd()
148  {
149  return $this->path;
150  }
151 
159  function cd($path)
160  {
161  $path = $this->realpath($path);
162  if (is_dir($path) && file_exists($path)) {
163  return $this->path = $path;
164  }
165  return false;
166  }
167 
177  function read($sort = true, $exceptions = false)
178  {
179  $dirs = $files = array();
180  $dir = opendir($this->path);
181  if ($dir !== false) {
182  while (false !== ($n = readdir($dir))) {
183  $item = false;
184  if (is_array($exceptions)) {
185  if (!in_array($n, $exceptions)) {
186  $item = $n;
187  }
188  } else if ((!preg_match('/^\\.+$/', $n) && $exceptions == false) || ($exceptions == true && !preg_match('/^\\.(.*)$/', $n))) {
189  $item = $n;
190  }
191  if ($item !== false) {
192  if (is_dir($this->addPathElement($this->path, $item))) {
193  $dirs[] = $item;
194  } else {
195  $files[] = $item;
196  }
197  }
198  }
199  if ($sort || $this->sort) {
200  sort($dirs);
201  sort($files);
202  }
203  closedir($dir);
204  }
205  return array(
206  $dirs ,
207  $files);
208  }
209 
217  function find($regexp_pattern = '.*', $sort = false)
218  {
219  $data = $this->read($sort);
220  if (!is_array($data)) {
221  return array();
222  }
223  list ($dirs, $files) = $data;
224  $found = array();
225  foreach ($files as $file) {
226  if (preg_match("/^{$regexp_pattern}$/i", $file)) {
227  $found[] = $file;
228  }
229  }
230  return $found;
231  }
232 
240  function findRecursive($pattern = '.*', $sort = false)
241  {
242  $startsOn = $this->path;
243  $out = $this->_findRecursive($pattern, $sort);
244  $this->cd($startsOn);
245  return $out;
246  }
247 
255  function _findRecursive($pattern, $sort = false)
256  {
257  list ($dirs, $files) = $this->read($sort);
258  $found = array();
259  foreach ($files as $file) {
260  if (preg_match("/^{$pattern}$/i", $file)) {
261  $found[] = $this->addPathElement($this->path, $file);
262  }
263  }
265  foreach ($dirs as $dir) {
266  $this->cd($this->addPathElement($start, $dir));
267  $found = array_merge($found, $this->findRecursive($pattern));
268  }
269  return $found;
270  }
271 
281  {
282  if (preg_match('/^[A-Z]:\\\\/i', $path)) {
283  return true;
284  }
285  return false;
286  }
287 
296  function isAbsolute($path)
297  {
298  $match = preg_match('/^\\//', $path) || preg_match('/^[A-Z]:\\//i', $path);
299  return $match;
300  }
301 
311  {
313  return '\\';
314  }
315  return '/';
316  }
317 
327  {
329  return '\\';
330  }
331  return '/';
332  }
333 
342  function slashTerm($path)
343  {
345  return $path;
346  }
348  }
349 
359  function addPathElement($path, $element)
360  {
361  return $this->slashTerm($path) . $element;
362  }
363 
370  function inXoopsPath($path = '')
371  {
372  $dir = substr($this->slashTerm(XOOPS_ROOT_PATH), 0, - 1);
373  $newdir = $dir . $path;
374  return $this->inPath($newdir);
375  }
376 
383  function inPath($path = '', $reverse = false)
384  {
385  $dir = $this->slashTerm($path);
386  $current = $this->slashTerm($this->pwd());
387  if (!$reverse) {
388  $return = preg_match('/^(.*)' . preg_quote($dir, '/') . '(.*)/', $current);
389  } else {
390  $return = preg_match('/^(.*)' . preg_quote($current, '/') . '(.*)/', $dir);
391  }
392  if ($return == 1) {
393  return true;
394  } else {
395  return false;
396  }
397  }
398 
409  function chmod($path, $mode = false, $recursive = true, $exceptions = array())
410  {
411  if (!$mode) {
412  $mode = $this->mode;
413  }
414  if ($recursive === false && is_dir($path)) {
415  if (chmod($path, intval($mode, 8))) {
416  $this->messages[] = sprintf('%s changed to %s', $path, $mode);
417  return true;
418  } else {
419  $this->errors[] = sprintf('%s NOT changed to %s', $path, $mode);
420  return false;
421  }
422  }
423  if (is_dir($path)) {
424  list ($paths) = $this->tree($path);
425  foreach ($paths as $key => $fullpath) {
426  $check = explode('/', $fullpath);
427  $count = count($check);
428 
429  if (in_array($check[$count - 1], $exceptions)) {
430  continue;
431  }
432 
433  if (chmod($fullpath, intval($mode, 8))) {
434  $this->messages[] = sprintf('%s changed to %s', $fullpath, $mode);
435  } else {
436  $this->errors[] = sprintf('%s NOT changed to %s', $fullpath, $mode);
437  }
438  }
439  if (empty($this->errors)) {
440  return true;
441  }
442  }
443  return false;
444  }
445 
455  function tree($path, $hidden = true, $type = null)
456  {
457  $path = rtrim($path, '/');
458  $this->files = array();
459  $this->directories = array(
460  $path);
461  $directories = array();
462  while (count($this->directories)) {
463  $dir = array_pop($this->directories);
464  $this->_tree($dir, $hidden);
465  array_push($directories, $dir);
466  }
467  if ($type === null) {
468  return array(
469  $directories ,
470  $this->files);
471  }
472  if ($type === 'dir') {
473  return $directories;
474  }
475  return $this->files;
476  }
477 
485  function _tree($path, $hidden)
486  {
487  if (is_dir($path)) {
488  $dirHandle = opendir($path);
489  while (false !== ($item = readdir($dirHandle))) {
490  $found = false;
491  if (($hidden === true && $item != '.' && $item != '..') || ($hidden === false && ! preg_match('/^\\.(.*)$/', $item))) {
492  $found = $path . '/' . $item;
493  }
494  if ($found !== false) {
495  if (is_dir($found)) {
496  array_push($this->directories, $found);
497  } else {
498  array_push($this->files, $found);
499  }
500  }
501  }
502  closedir($dirHandle);
503  }
504  }
505 
514  function create($pathname, $mode = false)
515  {
516  if (is_dir($pathname) || empty($pathname)) {
517  return true;
518  }
519  if (! $mode) {
520  $mode = $this->mode;
521  }
522  if (is_file($pathname)) {
523  $this->errors[] = sprintf('%s is a file', $pathname);
524  return true;
525  }
526  $nextPathname = substr($pathname, 0, strrpos($pathname, '/'));
527  if ($this->create($nextPathname, $mode)) {
528  if (!file_exists($pathname)) {
529  if (mkdir($pathname, intval($mode, 8))) {
530  $this->messages[] = sprintf('%s created', $pathname);
531  return true;
532  } else {
533  $this->errors[] = sprintf('%s NOT created', $pathname);
534  return false;
535  }
536  }
537  }
538  return true;
539  }
540 
547  function dirsize()
548  {
549  $size = 0;
550  $directory = $this->slashTerm($this->path);
551  $stack = array($directory);
552  $count = count($stack);
553  for ($i = 0, $j = $count; $i < $j; ++ $i) {
554  if (is_file($stack[$i])) {
555  $size += filesize($stack[$i]);
556  } else if (is_dir($stack[$i])) {
557  $dir = dir($stack[$i]);
558  if ($dir) {
559  while (false !== ($entry = $dir->read())) {
560  if ($entry == '.' || $entry == '..') {
561  continue;
562  }
563  $add = $stack[$i] . $entry;
564  if (is_dir($stack[$i] . $entry)) {
565  $add = $this->slashTerm($add);
566  }
567  $stack[] = $add;
568  }
569  $dir->close();
570  }
571  }
572  $j = count($stack);
573  }
574  return $size;
575  }
576 
584  function delete($path)
585  {
586  $path = $this->slashTerm($path);
587  if (is_dir($path) === true) {
588  $files = glob($path . '*', GLOB_NOSORT);
589  $normal_files = glob($path . '*');
590  $hidden_files = glob($path . '\.?*');
591  $files = array_merge($normal_files, $hidden_files);
592  if (is_array($files)) {
593  foreach ($files as $file) {
594  if (preg_match("/(\.|\.\.)$/", $file)) {
595  continue;
596  }
597  if (is_file($file) === true) {
598  if (unlink($file)) {
599  $this->messages[] = sprintf('%s removed', $path);
600  } else {
601  $this->errors[] = sprintf('%s NOT removed', $path);
602  }
603  } else if (is_dir($file) === true) {
604  if ($this->delete($file) === false) {
605  return false;
606  }
607  }
608  }
609  }
610  $path = substr($path, 0, strlen($path) - 1);
611  if (rmdir($path) === false) {
612  $this->errors[] = sprintf('%s NOT removed', $path);
613  return false;
614  } else {
615  $this->messages[] = sprintf('%s removed', $path);
616  }
617  }
618  return true;
619  }
620 
628  function copy($options = array())
629  {
630  $to = null;
631  if (is_string($options)) {
632  $to = $options;
633  $options = array();
634  }
635  $options = array_merge(array(
636  'to' => $to ,
637  'from' => $this->path ,
638  'mode' => $this->mode ,
639  'skip' => array()), $options);
640 
641  $fromDir = $options['from'];
642  $toDir = $options['to'];
643  $mode = $options['mode'];
644  if (!$this->cd($fromDir)) {
645  $this->errors[] = sprintf('%s not found', $fromDir);
646  return false;
647  }
648  if (!is_dir($toDir)) {
649  mkdir($toDir, $mode);
650  }
651  if (!is_writable($toDir)) {
652  $this->errors[] = sprintf('%s not writable', $toDir);
653  return false;
654  }
655  $exceptions = array_merge(array(
656  '.' ,
657  '..' ,
658  '.svn'), $options['skip']);
659  $handle = opendir($fromDir);
660  if ($handle) {
661  while (false !== ($item = readdir($handle))) {
662  if (!in_array($item, $exceptions)) {
663  $from = $this->addPathElement($fromDir, $item);
664  $to = $this->addPathElement($toDir, $item);
665  if (is_file($from)) {
666  if (copy($from, $to)) {
667  chmod($to, intval($mode, 8));
668  touch($to, filemtime($from));
669  $this->messages[] = sprintf('%s copied to %s', $from, $to);
670  } else {
671  $this->errors[] = sprintf('%s NOT copied to %s', $from, $to);
672  }
673  }
674  if (is_dir($from) && !file_exists($to)) {
675  if (mkdir($to, intval($mode, 8))) {
676  chmod($to, intval($mode, 8));
677  $this->messages[] = sprintf('%s created', $to);
678  $options = array_merge($options, array(
679  'to' => $to ,
680  'from' => $from));
681  $this->copy($options);
682  } else {
683  $this->errors[] = sprintf('%s not created', $to);
684  }
685  }
686  }
687  }
688  closedir($handle);
689  } else {
690  return false;
691  }
692  if (!empty($this->errors)) {
693  return false;
694  }
695  return true;
696  }
697 
705  function move($options)
706  {
707  $to = null;
708  if (is_string($options)) {
709  $to = $options;
710  $options = (array) $options;
711  }
712  $options = array_merge(array(
713  'to' => $to ,
714  'from' => $this->path ,
715  'mode' => $this->mode ,
716  'skip' => array()), $options);
717  if ($this->copy($options)) {
718  if ($this->delete($options['from'])) {
719  return $this->cd($options['to']);
720  }
721  }
722  return false;
723  }
724 
731  function messages()
732  {
733  return $this->messages;
734  }
735 
742  function errors()
743  {
744  return $this->errors;
745  }
746 
753  function realpath($path)
754  {
755  $path = trim($path);
756  if (strpos($path, '..') === false) {
757  if (!$this->isAbsolute($path)) {
758  $path = $this->addPathElement($this->path, $path);
759  }
760  return $path;
761  }
762  $parts = explode('/', $path);
763  $newparts = array();
764  $newpath = $path{0} == '/' ? '/' : '';
765  while (($part = array_shift($parts)) !== null) {
766  if ($part == '.' || $part == '') {
767  continue;
768  }
769  if ($part == '..') {
770  if (count($newparts) > 0) {
771  array_pop($newparts);
772  continue;
773  } else {
774  return false;
775  }
776  }
777  $newparts[] = $part;
778  }
779  $newpath .= implode('/', $newparts);
780  if (strlen($path > 1) && $path{strlen($path) - 1} == '/') {
781  $newpath .= '/';
782  }
783  return $newpath;
784  }
785 
794  function isSlashTerm($path)
795  {
796  if (preg_match('/[\/\\\]$/', $path)) {
797  return true;
798  }
799  return false;
800  }
801 }
802 
803 ?>