301 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * Filesystem lib
 | 
						|
 * provides basic filesystem handling functions.
 | 
						|
 *
 | 
						|
 * @author NoWhereMan <nowhereman@phreaker.net>
 | 
						|
 */
 | 
						|
class fs_filelister {
 | 
						|
 | 
						|
	var $_list = array();
 | 
						|
 | 
						|
	var $_directory = null;
 | 
						|
 | 
						|
	// constructor
 | 
						|
	function __construct($directory = null) {
 | 
						|
		if ($directory)
 | 
						|
			$this->_directory = $directory;
 | 
						|
		$this->_listFiles($this->_directory);
 | 
						|
	}
 | 
						|
 | 
						|
	function _checkFile($directory, $file) {
 | 
						|
		if (!is_dir("$directory/$file"))
 | 
						|
			array_push($this->_list, $file);
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	function _exitingDir($directory, $file) {
 | 
						|
	}
 | 
						|
 | 
						|
	function _listFiles($directory) {
 | 
						|
 | 
						|
		// Try to open the directory
 | 
						|
		if (!file_exists($directory))
 | 
						|
			return array();
 | 
						|
 | 
						|
		if ($dir = opendir($directory)) {
 | 
						|
			// Add the files
 | 
						|
			while ($file = readdir($dir)) {
 | 
						|
				if (!fs_is_directorycomponent($file)) {
 | 
						|
					$action = $this->_checkFile($directory, $file);
 | 
						|
 | 
						|
					// $action == 0: ok, go on
 | 
						|
					// $action == 1: recurse
 | 
						|
					// $action == 2: exit function
 | 
						|
 | 
						|
					switch ($action) {
 | 
						|
						case (1):
 | 
						|
							{
 | 
						|
								$this->_listFiles("$directory/$file");
 | 
						|
								$this->_exitingDir($directory, $file);
 | 
						|
								break;
 | 
						|
							}
 | 
						|
						case (2):
 | 
						|
							{
 | 
						|
								return false;
 | 
						|
							}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// Finish off the function
 | 
						|
			closedir($dir);
 | 
						|
			return true;
 | 
						|
		} else
 | 
						|
			return false;
 | 
						|
	}
 | 
						|
 | 
						|
	function getList() {
 | 
						|
		// $this->_listFiles($this->_directory);
 | 
						|
		return $this->_list;
 | 
						|
	}
 | 
						|
 | 
						|
	function count() {
 | 
						|
		if (!isset($this->count))
 | 
						|
			$this->count = count($this->_list);
 | 
						|
		return $this->count;
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
class fs_pathlister extends fs_filelister {
 | 
						|
 | 
						|
	function _checkFile($directory, $file) {
 | 
						|
		$f = "$directory/$file";
 | 
						|
		if (!is_dir($f))
 | 
						|
			array_push($this->_list, $f);
 | 
						|
		else
 | 
						|
			return 1;
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
// dir list
 | 
						|
function fs_list_dirs($dir) {
 | 
						|
	$dh = opendir($dir);
 | 
						|
	while (false !== ($filename = readdir($dh))) {
 | 
						|
		if (($filename [0] != '.')) {
 | 
						|
			// $id = lang_id($filename);
 | 
						|
			$files [] = $filename;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	sort($files);
 | 
						|
	return $files;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * function fs_mkdir
 | 
						|
 *
 | 
						|
 * <p>Function from : {@link http://www.php.net/function.mkdir.php}</p>
 | 
						|
 *
 | 
						|
 * <p>Recursively creates dirs.</p>
 | 
						|
 * <p>Returns true on success, else false</p>
 | 
						|
 *
 | 
						|
 * @param string $path
 | 
						|
 *        	Directory or directories to create
 | 
						|
 * @param int $mode
 | 
						|
 *        	octal mode value; same as UNIX chmod; defaults to 0777 (rwrwrw);
 | 
						|
 * @return bool
 | 
						|
 *
 | 
						|
 * @todo cleanup & check bool return value
 | 
						|
 *      
 | 
						|
 */
 | 
						|
function fs_mkdir($dir, $mode = DIR_PERMISSIONS) {
 | 
						|
	if (is_dir($dir) || (@mkdir($dir, $mode))) {
 | 
						|
		@chmod($dir, $mode);
 | 
						|
		return TRUE;
 | 
						|
	}
 | 
						|
	if (!fs_mkdir(dirname($dir), $mode))
 | 
						|
		return FALSE;
 | 
						|
	return (@mkdir($dir, $mode) && @chmod($dir, $mode));
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * function fs_delete
 | 
						|
 *
 | 
						|
 * Deletes a file and recursively deletes dirs, if they're empty
 | 
						|
 */
 | 
						|
function fs_delete($path) {
 | 
						|
	if (file_exists($path)) {
 | 
						|
 | 
						|
		$fsuccess = unlink($path);
 | 
						|
		$dsuccess = true;
 | 
						|
 | 
						|
		while ($dsuccess) {
 | 
						|
 | 
						|
			$path = dirname($path);
 | 
						|
			$dsuccess = @rmdir($path);
 | 
						|
		}
 | 
						|
 | 
						|
		// unlink can return both 0 and false -__-'
 | 
						|
		return ($fsuccess);
 | 
						|
	}
 | 
						|
 | 
						|
	// in our particular implementation
 | 
						|
	// you can always delete a non existent file;
 | 
						|
	// anyway, we'll return a value != false
 | 
						|
	// so that we can anyway track it back
 | 
						|
 | 
						|
	return 2;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * function fs_recursive_chmod
 | 
						|
 *
 | 
						|
 * Perform a recursive reset of file permission in the given $path
 | 
						|
 * and its subdirectories to 0777
 | 
						|
 *
 | 
						|
 * @param $fpath dir
 | 
						|
 *        	path
 | 
						|
 * @return bool
 | 
						|
 *
 | 
						|
 */
 | 
						|
class fs_chmodder extends fs_filelister {
 | 
						|
 | 
						|
	var $_chmod_dir;
 | 
						|
 | 
						|
	var $_chmod_file;
 | 
						|
 | 
						|
	function __construct($directory, $ch_file = FILE_PERMISSIONS, $ch_dir = DIR_PERMISSIONS) {
 | 
						|
		$this->_directory = $directory;
 | 
						|
		$this->_chmod_file = $ch_file;
 | 
						|
		$this->_chmod_dir = $ch_dir;
 | 
						|
		parent::__construct();
 | 
						|
	}
 | 
						|
 | 
						|
	function _checkFile($directory, $file) {
 | 
						|
		$retval = 0;
 | 
						|
		$path = "$directory/$file";
 | 
						|
		if (is_dir($path))
 | 
						|
			$retval = 1;
 | 
						|
		if (!@chmod($path, ($retval ? $this->_chmod_dir : $this->_chmod_file)))
 | 
						|
			array_push($this->_list, $path);
 | 
						|
 | 
						|
		return $retval;
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
function fs_chmod_recursive($fpath = FP_CONTENT) {
 | 
						|
	$obj = new fs_chmodder($fpath);
 | 
						|
	return $obj->getList();
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * recursive deletion
 | 
						|
 * deletes all files and directories recursively in the given $path
 | 
						|
 *
 | 
						|
 * @param $fpath dir
 | 
						|
 *        	path
 | 
						|
 * @return bool
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 * class fs_deleter extends fs_filelister {
 | 
						|
 *
 | 
						|
 * function fs_deleter($directory) {
 | 
						|
 * $this->_directory = $directory;
 | 
						|
 * parent::__construct();
 | 
						|
 * }
 | 
						|
 *
 | 
						|
 * function _checkFile($directory, $file) {
 | 
						|
 *
 | 
						|
 * $path = "$directory/$file";
 | 
						|
 *
 | 
						|
 * /*
 | 
						|
 * open dir handle prevents directory deletion of php5 (and probably win)
 | 
						|
 * thanks to cimangi <cimangi (at) yahoo (dot) it> for noticing and
 | 
						|
 * giving a possible solution:
 | 
						|
 *
 | 
						|
 * filenames are cached and then deleted
 | 
						|
 * //
 | 
						|
 *
 | 
						|
 * if ( is_dir($path) ) {
 | 
						|
 * return 1;
 | 
						|
 * } elseif ( file_exists($path) ) {
 | 
						|
 * array_push($this->_list, $path);
 | 
						|
 * return 0;
 | 
						|
 * } else {
 | 
						|
 * return 2;
 | 
						|
 * }
 | 
						|
 *
 | 
						|
 * }
 | 
						|
 *
 | 
						|
 * }
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 * open dir handle prevents directory deletion of php5 (and probably win)
 | 
						|
 * thanks to cimangi <cimangi (at) yahoo (dot) it> for noticing and
 | 
						|
 * giving a possible solution;
 | 
						|
 *
 | 
						|
 * paths are now cached and then deleted
 | 
						|
 */
 | 
						|
function fs_delete_recursive($path) {
 | 
						|
	if (file_exists($path)) {
 | 
						|
 | 
						|
		$obj = new fs_pathlister($path);
 | 
						|
		$list = ($obj->getList());
 | 
						|
 | 
						|
		unset($obj);
 | 
						|
 | 
						|
		$elem = null;
 | 
						|
		while ($elem = array_pop($list)) {
 | 
						|
			$elem;
 | 
						|
			fs_delete($elem);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
function fs_copy($source, $dest) {
 | 
						|
	if ($contents = io_load_file($source)) {
 | 
						|
		return io_write_file($dest, $contents);
 | 
						|
	}
 | 
						|
	return false;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if the file with the given name is a directory component ('.' or '..').
 | 
						|
 *
 | 
						|
 * @param string $filename
 | 
						|
 *        	the file name
 | 
						|
 * @return boolean <code>true</code> if the file is a directory component; otherwise <code>false</code>
 | 
						|
 */
 | 
						|
function fs_is_directorycomponent($filename) {
 | 
						|
	return $filename === '.' || $filename === '..';
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks if the file with the given name is a hidden file (i.e., starts with a '.').
 | 
						|
 *
 | 
						|
 * @param string $filename
 | 
						|
 *        	the file name
 | 
						|
 * @return boolean <code>true</code> if the file is a hidden file; otherwise <code>false</code>
 | 
						|
 */
 | 
						|
function fs_is_hidden_file($filename) {
 | 
						|
	return strlen($filename) > 0 && substr($filename, 0, 1) === '.';
 | 
						|
} |