Location: PHPKode > scripts > File class > file-class-1403/file.class.php
<?
/**
* File handling class
*
* @author    Sven Wagener <wagener_at_indot_dot_de>
* @include 	 Funktion:_include_
*
*/
class file{
	var $file;
	var $binary;
	var $name;
	var $size;
	
	var $debug;
	var $action_before_reading=false;
	
	/**
	* Constructor of class
	* @param string $filename The name of the file
	* @param boolean $binarty Optional. If file is a binary file then set TRUE, otherwise FALSE
	* @desc Constructor of class
	*/
	function file($filename,$binary=false){
		$this->name=$filename;
		$this->binary=$binary;
		
		if($binary){
			$this->file=@fopen($filename,"a+b");
			if(!$this->file){
				$this->file=@fopen($filename,"rb");
			}
		}else{
			$this->file=@fopen($filename,"a+");
			if(!$this->file){
				$this->file=@fopen($filename,"r");
			}
		}
	}
	
	/**
	* Returns the filesize in bytes
	* @return int $filesize The filesize in bytes
	* @desc Returns the filesize in bytes
	*/
	function get_size(){
		return filesize($this->name);
	}
	
	/**
	* Returns the timestamp of the last change
	* @return timestamp $timestamp The time of the last change as timestamp
	* @desc Returns the timestamp of the last change
	*/
	function get_time(){
		return fileatime($this->name);
	}
	
	/**
	* Returns the filename
	* @return string $filename The filename
	* @desc Returns the filename
	*/
	function get_name(){
		return $this->name;
	}
	
	/**
	* Returns user id of the file
	* @return string $user_id The user id of the file
	* @desc Returns user id of the file
	*/
	function get_owner_id(){
		return fileowner($this->name);
	}
	
	/**
	* Returns group id of the file
	* @return string $group_id The group id of the file
	* @desc Returns group id of the file
	*/
	function get_group_id(){
		return filegroup($this->name);
	}
	
	/**
	* Returns the suffix of the file
	* @return string $suffix The suffix of the file. If no suffix exists FALSE will be returned
	* @desc Returns the suffix of the file
	*/
	function get_suffix(){
		$file_array=split("\.",$this->name); // Splitting prefix and suffix of real filename
		$suffix=$file_array[count($file_array)-1]; // Returning file type
		if(strlen($suffix)>0){
			return $suffix;
		}else{
			return false;
		}
	}
	
	/**
	* Sets the actual pointer position
	* @return int $offset Returns the actual pointer position
	* @desc Returns the actual pointer position
	*/
	function pointer_set($offset){
		$this->action_before_reading=true;
		return fseek($this->file,$offset);
	}
	
	/**
	* Returns the actual pointer position
	* @param int $offset Returns the actual pointer position
	* @desc Returns the actual pointer position
	*/
	function pointer_get(){
		return ftell($this->file);
	}
	
	/**
	* Reads a line from the file
	* @return string $line A line from the file. If is EOF, false will be returned
	* @desc Reads a line from the file
	*/
	function read_line(){
		if($this->action_before_reading){
			if(rewind($this->file)){
				$this->action_before_reading=false;
				return fgets($this->file);
			}else{
				$this->halt("Pointer couldn't be reset");
				return false;
			}
		}else{
			return fgets($this->file);
		}
	}
	
	/**
	* Reads data from a binary file
	* @return string $line Data from a binary file
	* @desc Reads data from a binary file
	*/
	function read_bytes($bytes,$start_byte=0){
		if(is_int($start_byte)){
			if(rewind($this->file)){
				if($start_byte>0){
					$this->pointer_set($start_byte);
					return fread($this->file,$bytes);
				}else{
					return fread($this->file,$bytes);
				}
			}else{
				$this->halt("Pointer couldn't be reset");
				return false;
			}
		}else{
			$this->halt("Start byte have to be an integer");
			return false;
		}
	}
	
	/**
	* Writes data to the file
	* @param string $data The data which have to be written
	* @return boolean $written Returns TRUE if data could be written, FALSE if not
	* @desc Writes data to the file
	*/
	function write($data){
		$this->action_before_reading=true;
		if(strlen($data)>0){
			if($this->binary){
				$bytes=fwrite($this->file,$data);
				if(is_int($bytes)){
					return $bytes;
				}else{
					$this->halt("Couldn't write data to file, please check permissions");
					return false;
				}
			}else{
				$bytes=fputs($this->file,$data);
				if(is_int($bytes)){
					return $bytes;
				}else{
					$this->halt("Couldn't write data to file, please check permissions");
					return false;
				}
			}
		}else{
			$this->halt("Data must have at least one byte");
		}
	}
	
	/**
	* Copies a file to the given destination
	* @param string $destination The new file destination
	* @return boolean $copied Returns TRUE if file could bie copied, FALSE if not
	* @desc Copies a file to the given destination
	*/
	function copy($destination){
		if(strlen($destination)>0){
			if(copy($this->name,$destination)){
				return true;
			}else{
				$this->halt("Couldn't copy file to destination, please check permissions");
				return false;
			}
		}else{
			$this->halt("Destination must have at least one char");
		}
	}
	
	/**
	* Searches a string in file
	* @param string $string The string which have to be searched
	* @return array $found_bytes Pointer offsets where string have been found. On no match, function returns false
	* @desc Searches a string in file
	*/
	function search($string){
		if(strlen($string)!=0){
			
			$offsets=array();
			
			$offset=$this->pointer_get();
			rewind($this->file);
			
			// Getting all data from file
			$data=fread($this->file,$this->get_size());
			
		    // Replacing \r in windows new lines
			$data=preg_replace("[\r]","",$data);
			
			$found=false;
			$k=0;
			
			for($i=0;$i<strlen($data);$i++){
				
				$char=$data[$i];
				$search_char=$string[0];
				
				// If first char of string have been found and first char havn't been found
				if($char==$search_char && $found==false){
					$j=0;
					$found=true;
					$found_now=true;
				}				
				
				// If beginning of the string have been found and next char have been set
				if($found==true && $found_now==false){
					$j++;
					// If next char have been found
					if($data[$i]==$string[$j]){
						// If complete string have been matched
						if(($j+1)==strlen($string)){
							$found_offset=$i-strlen($string)+2;
							$offsets[$k++]=$found_offset;
						}						
					}else{
						$found=false;
					}
					
				}
				
				$found_now=false;				
			}
			
			$this->pointer_set($offset);
			
			return $offsets;
		}else{
			$this->halt("Search String have to be at least 1 chars");
		}
	}
	
	/**
	* Prints out a error message
	* @param string $message all occurred errors as array
	* @desc Returns all occurred errors
	*/
	function halt($message){
		if($this->debug){
			printf("File error: %s\n", $message);
			if($this->error_nr!="" && $this->error!=""){
				printf("MySQL Error: %s (%s)\n",$this->error_nr,$this->error);
			}
			die ("Session halted.");
		}
	}
	
	/**
	* Switches to debug mode
	* @param boolean $switch
	* @desc Switches to debug mode
	*/
	function debug_mode($debug=true){
		$this->debug=$debug;
		if(!$this->file){
			$this->halt("File couln't be opened, please check permissions");
		}
	}
}
?>
Return current item: File class