PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bzwrite() unvollständig



undefined
31-03-2004, 19:36
Also ich bin mir jetzt nicht mer sicher aber mein Code Stimmt soweit, Ich bekomme auch keine Fehler Meldung, jedoch schreibt er mir statt die 140 Zeilen nur die Hälft ins File. Kann bitte jemand mal Testen und mir sagen was bei im herauskommt, ich vermute so langsam das es sich um einen Bug handelt :(

class phpcodes {
private $TMPDIR;

function __construct()
{
// JB_CODES_DIR = Arbeitsverzeichnis
if ( defined( "JB_CODES_DIR" ) && is_writable( JB_CODES_DIR ) ) {
$this->TMPDIR = JB_CODES_DIR;
}
}

private function phc_read_dir()
{
$tmp = scandir( $this->TMPDIR );
if ( is_array( $tmp ) ) {
$buff = array();
foreach ( $tmp AS $fi ) {
if ( preg_match( "/^\\d+\\.[gz|bz2]$/" , $fi ) ) {
$buff[] = chop( $fi );
}
}
return $buff;
}
}

private function phc_write_files($str)
{
if ( is_string( $str ) ) {
$key = time();
$fiz = chop($this->TMPDIR . $key . ".bz2");
if ( !file_exists( $fiz ) ) {
$si = (int)strlen($str);
$fbz = bzopen( $fiz, "w" );
bzwrite( $fbz, $str, (int)$si );
$debug = bzerror ( $fbz );
bzclose( $fbz );
print_r( $debug );
return $key;
}
}
}

private function phc_read_file($in)
{
$fi = $this->TMPDIR . $in . ".bz2";
if ( file_exists( $fi ) ) {
$bz = bzopen( $fi, "r" );
$dec = bzread( $bz, filesize( $fi ) );
bzclose( $bz );
return highlight_string( stripslashes( $dec ) );
}
}

public function phc_testit($str)
{
$k = $this->phc_write_files($str);
return $this->phc_read_file($k);
}
}
?>
$codes = &new phpcodes();
echo "<pre>";
$file = preg_replace("/\\'{2,}/", "'", file_get_contents("TEST", filesize("TEST")));
print_r( $codes->phc_testit( $file ) );
echo "</pre>";
merci ;)

undefined
01-04-2004, 09:20
Bin etwas weiter gekommen, liegt offensichtlich daran das innerhalb der Methode der übergebene Stream nicht richtig gelesen wird, wenn ich erst eine Logfile erstelle kann ich komplett schreiben jedoch habe ich jetzt beim lesen genau das gleiche Problem.

undefined
01-04-2004, 11:43
Hat sich erledigt ;)
Liegt offensichtlich daran das die decomprimierten Bytes nicht richtig gelesen werden.

private function phc_read_file($fi)
{
$file = $this->TMPDIR . $fi . ".log.bz2";
if ( file_exists( $file ) ) {
$bz = bzopen( $file, "r" );
if ( feof( $bz ) == false ) {
$si = ( filesize( $file )*3 );
$dec = bzread( $bz, $si );
}
$deb = bzerrstr( $bz );
bzclose( $bz );
if ( $deb == "OK" ) {
$cod = $this->phc_str_clear( $dec );
$cod = stripslashes( $cod );
return $cod;
}
}
}

Habe das ganze mal drei genommen und jetzt funzt es.

mehlvogel
02-04-2004, 14:58
Ich vermute mal das es daran liegt, das die zweite übergebene Größe an bzread() die Zahl der dekomprimierten Bytes ist. Die Dateigröße ist deshalb irrelevant, weil sie nicht darüber aufschluss gibt, wieviel Daten dadrin komprimiert liegen. Wie das bei .bz ist, weis ich net genau, aber vermute das es von dem Kompressionsgrad abhängt, und wenn du bz jetzt ne Datei gibst, die es um mehr als 66% komprimieren würde, würdest du wieder in Probleme laufen. Die sauberste Lösung wäre wohl eine Schleife bis eof laufen zu lassen und die Daten in Abschnitten dort auslesen, also pseudo-code ungefähr so



while (!eof) $content .= bzread();


Wenn das so ausreichend ist, ist es aber denk ich auch i.O.

undefined
02-04-2004, 16:49
Ich bin bei der Fehlersuche auch von Komprimierungsgrad ausgegangen, nur steht leider in der Manual nichts über deren Verwendung. Bei bzwrite kam mir der Gedanke das es daran gelegen hat daß ich keine Datei an eine Methode übergeben hatte sondern ein Array, und es im stak daher nicht erkannt wurde, nach dem ich dann die Datei an die Methode weiterleitete und dies innerhalb der Methode Komprimierte ging es. Also vermute ich mal das es daran liegt, denn die Verwendung von eof hatte ich auch eingesetzt was das gleiche Resultat ergab. Gut mir ist bekannt das bzread ohne den Optionalen Parameter length nur 1024 Bytes liest und dann abbricht. Leider gibt es keine Möglichkeit den Komprimierungsgrad zu ermitteln, das würde die ganze Geschichte wesentlich vereinfachen. Im prinzip muste ich beim Schreiben schon doppelt arbeiten weil ich das erstellen der Datei eigentlich überspringen wollte.

private function phc_write_bzfile($fiz)
{
if ( file_exists( $fiz ) ) {
$str = file_get_contents( $fiz , filesize( $fiz ) );
$log = $this->phc_str_clear( $str );
if ( !file_exists( $fiz . ".bz2" ) ) {
$si = (int)strlen( $log );
$fbz = bzopen( $fiz . ".bz2", "w+" );
if ( feof( $fbz ) == false ) {
bzwrite( $fbz, $log, $si );
}
$debug = bzerror( $fbz );
bzclose( $fbz );
if ( $debug['errno'] == "0" ) {
unlink( $fiz );
return true;
} else {
return false;
}
}
}
}