fopen() mit a+ und dann rewind() ist das selbe wie fopen() mit r+.
Wenn du etwas an eine bestimmte Position in der Datei schreibst, wird alles was danach kommt nicht etwa um die Anzahl der geschriebenen Zeichen weitergeschoben sondern überschrieben. Wenn die Zeile nach dem gesuchten Pattern nur ein \n enthält und du dort hallo\n hinschreibst, werden die nächsten 5 Zeichen nach dem ursprünglichen \n überschrieben.
Einziger Ausweg: Vor dem Schreiben mußt du den gesamten Rest der Datei zwischenspeichern und dann wieder anhängen.
Das könnte ungefähr so aussehen (Achtung, ungetestet!):
Bei dieser Problemstellung würde ich allerdings zu file() greifen.
Etwa so (wiederum ungetestet!):
Wenn du etwas an eine bestimmte Position in der Datei schreibst, wird alles was danach kommt nicht etwa um die Anzahl der geschriebenen Zeichen weitergeschoben sondern überschrieben. Wenn die Zeile nach dem gesuchten Pattern nur ein \n enthält und du dort hallo\n hinschreibst, werden die nächsten 5 Zeichen nach dem ursprünglichen \n überschrieben.
Einziger Ausweg: Vor dem Schreiben mußt du den gesamten Rest der Datei zwischenspeichern und dann wieder anhängen.
Das könnte ungefähr so aussehen (Achtung, ungetestet!):
PHP-Code:
$fh = fopen($this->LogFilePath, 'r+');
if ($fh) {
while (!feof($fh)) {
$line = fgets($fh);
$pointer = ftell($fh);
if (strpos($line, '['.$where.']') !== false
&& (feof($fh) || strlen(trim(fgets($fh)) == 0))) {
$rest = '';
while (!feof($fh)) $rest .= fgets($fh);
fseek($fh, $pointer);
fputs($fh, "hallo\n".$rest);
break;
}
}
fclose($fh);
}
Etwa so (wiederum ungetestet!):
PHP-Code:
$lines = file($this->LogFilePath);
foreach ($lines as $num => $line) {
if (trim($line) == '['.$where.']'
&& strlen(trim($lines[$num+1])) == 0) {
$lines = array_slice($lines, 0, $num)
+ array($num+1 => "hallo\n")
+ array_slice($lines, $num+1);
file_put_contents($this->LogFilePath, implode('', $lines));
break;
}
}
Kommentar