mAu's Klassen- und Scriptethread

mAu

Erfahrenes Mitglied
Ich bin mal so unverschämt und erstelle mir einen Thread, wo ich in Zukunft alle fertigen Scripte, Klassen und Updates für selbige posten werde.
Ich fange gleich mal mit dem ersten an, was heute entstanden ist.


iTunes-Playlist Konverter
Da ich mich schon des öfteren darüber aufgeregt hab, dass man bei iTunes seine Playlists nur als *.xml und *.txt exportieren kann und man somit das importieren in andere Programme alá foobar2000 vergessen kann, hab ich mich rangesetzt und eine kleine Klasse geschrieben, die mir eine als *.txt exportierte Playlist aus iTunes in eine gängige *.m3u-Datei umwandelt. Vielleicht sucht der ein oder andere sowas ja :)

P.s: sollte dieser Thead gegen irgendwelche Regeln verstoßen, dann bitte ich schon mal im Voraus um Entschuldigung. Ich konnte aber nix in den Regeln finden :)
 
Zuletzt bearbeitet:
So, ich mach mal weiter... ;)

File Klasse
Einfaches hinzufügen, auslesen und löschen von Inhalten in Dateien. Ein kleines Beispiel zur Anwendung:
PHP:
<?php
require ('class.file.new.php');
try
{
    $f = new File('datei.txt');
    $f->writeline('Hallo, ich bin die erste Zeile in diesem Dokument.');
    $f->writeline('Die Zweite Zeile bin dann wohl ich...');
    $f->writeline('Ich schummel mich ganz nach vorn :)', 0);
    $f->save();
    
    $inhalt = $f->read();
    echo nl2br($inhalt);
    
    /* Die ersten zwei Zeilen auslesen */
    $inhalt = $f->read(0, 2);
    echo nl2br($inhalt);
}
catch(FileException $e)
{
    echo $e->getMessage();
}
?>

Ein Counter kann man z.B. so realisieren:
PHP:
<?php
require ('class.file.new.php');
try
{
    $f = new File('count.txt');
    $visits = $f->read() + 1;
    $f->write($visits, 0);
    $f->save();
    
    echo $visits . ' Besucher';
}
catch(FileException $e)
{
    echo $e->getMessage();
}
?>
 

Anhänge

Hab heute mal mit einee Klasse für das Arbeiten mit großen Dateien angefangen, da man ab einer bestimmten Größe über [phpf]file[/phpf] mit diversen Fehlermeldungen abgespeist wird, da PHP nicht mit sehr bis extrem großen Arrays arbeiten kann.
Würde mich über Feedback freuen!

Nachtrag
Noch ein paar Kommentare zu den Funktionen eingefügt. Bitte nicht auf mein Englisch achten ;)
PHP:
<?php
class BigFile
{
	protected $file;
	
	/**
	* Constructor
	* @var: $file Filename
	*/
	public function __construct($file)
	{
		$file = trim($file);
		
		if(!file_exists($file) || !is_readable($file))
		{
			throw new Exception("File {$file} does not exist or is not readable");
		}
		
		$this->_file = $file;
	}

	/**
	* Read data beginning at $offset. If $offset is set to null (by default), BigFile::read() starts at line 0. If $lines is set to null, BigFile::read() reads from $offset until the end of the file.
	* @var: $offset int Line
	* @var: $lines int Lines to read
	*/	
	public function read($offset = null, $lines = null)
	{
		$offset = $offset === null ? 0 : intval($offset);
		$fp = fopen($this->_file, 'r');
		$line = 0;
		$data = '';
		
		if($offset > 0)
		{
			// Seek to offset line
			fseek($fp, $this->_seekLine($offset));
		}
		
		while(!feof($fp))
		{
			if($lines !== null && $line >= $lines)
			{
				break;
			}
			
			$data .= fgets($fp);			
			$line += 1;
		}			
		
		fclose($fp);
		
		return $data;		
	}

	/**
	* Write data to file. If $offset is set to null, BigFile::write() will append data at the end.
	* @var: $data str Content
	* @var: $offset int Line
	*/	
	public function write($data, $offset = null)
	{
		if($offset === null)
		{
			$fp = fopen($this->_file, 'a');
		}
		else
		{
			$fp = fopen($this->_file, 'r+');
		}
		
		$dataAfter = '';
		
		if($offset !== null)
		{
			fseek($fp, $this->_seekLine($offset));
			$dataAfter = fread($fp, filesize($this->_file));
			fseek($fp, $this->_seekLine($offset));
		}		
		
		if(fwrite($fp, $data . $dataAfter) === false)
		{
			throw new Exception("Could not write data to file {$this->_file}");
		}
		
		fclose($fp);
	}

	/**
	* Same as BigFile::write(), but inserts a linebreak at the end of $data
	* @var: $data str Content
	* @var: $offset int Line
	*/		
	public function writeLine($data, $offset = null)
	{
		$data = substr($data, 0, -2) == "\n" ? $data : $data . "\n";
		$this->write($data, $offset);
	}

	/**
	* Deletes data beginning at $offset. If $lines is set to null, one line will be deleted
	* @var: $offset int Line
	* @var: $lines int Number of lines to delete
	*/		
	public function delete($offset = null, $lines = null)
	{
		$dataBefore = $this->read(0, $offset - 1);
		$dataAfter = $this->read($offset + $lines);
		
		$fp = fopen($this->_file, 'w');
		fwrite($fp, $dataBefore . $dataAfter);
		fclose($fp);
	}
	
	/**
	* Based on a version by mhinks at gmail dot com @ http://www.php.net/fseek
	*/
	protected function _seekLine($offset)
	{
		$fp = fopen($this->_file, 'r');
		flock($fp, LOCK_SH);
		
		fseek($fp, 0, SEEK_END);
		$high = ftell($fp);
		$low = 0;
		
		while($low < $high)
		{
			$half = floor(($low + $high) / 2);
			// Let's seek to the middle of the file
			fseek($fp, $half);
			
			if($half != 0)
			{
				// Just jumping at the end of the actual line
				fgets($fp);
			}
			// Get the actual position for later fseeks
			$position = ftell($fp);
			
			fseek($fp, 0);	
			// Let's see, where we are
			$actLine = $position > 0 ? substr_count(fread($fp, $position), "\n") : 0;
			
			// Seek back to the old position
			fseek($fp, $position);
		
			// Check, if we got the line
			if($actLine == $offset)
			{
				// Return the position and close the filehandler
				fclose($fp);
				return $position;			
			}
			// Not the expected line
			else
			{
				// We are behind the offset line
				if ($offset < $actLine)
				{
					$high = $half - 1;
				}
				// We are before the offset line
				else
				{
					$low = $half + 1;
				}			
			}
		}
		
		// Line not found
		flock($fp, LOCK_UN);
		fclose($fp);
		return false;
	}
}
?>
 
Zuletzt bearbeitet:
Zurück