<?
/**
* 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");
}
}
}
?>
|