Ik ben bezig met een schrijven van een file editor class die statisch aangeroepen moet worden.
Alle functies die erin zitten werken onafhankelijk van elkaar prima, maar de functies append en prepend lijken elkaar in de weg te zitten bij gelijktijdig gebruik. Als ik in het zelfde programma eerst een append aanroep om data bij te schrijven en vervolgens een prepend (of andersom, zelfde gedrag) dan overschrijft append ineens de laatste tekens in de zin gelijk aan de lengte van de nieuwe in te voegen zin + 3 extra tekens. Ik zal het wel zo vaag omschrijven als dat het ook daadwerkelijk is, maar misschien zie ik iets over het hoofd.
In een debug sessie werd bij alle aanroepen van prepend en append het bestand wel volledig ingelezen en klopte de gegevens voordat ze weggeschreven zouden worden.
Alle functies die erin zitten werken onafhankelijk van elkaar prima, maar de functies append en prepend lijken elkaar in de weg te zitten bij gelijktijdig gebruik. Als ik in het zelfde programma eerst een append aanroep om data bij te schrijven en vervolgens een prepend (of andersom, zelfde gedrag) dan overschrijft append ineens de laatste tekens in de zin gelijk aan de lengte van de nieuwe in te voegen zin + 3 extra tekens. Ik zal het wel zo vaag omschrijven als dat het ook daadwerkelijk is, maar misschien zie ik iets over het hoofd.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| class FileEditor { protected static function fwrite($filename, $data, $type, $arg=false){ $fh = self::open($filename, $type); $bytes = filesize($filename); $filedata = ""; if($bytes == 0) $bytes = (self::DEFAULT_FILE_SIZE*1024); // if filesize returned 0 either the file was empty or it could not retreive size. Try to read 128KB default $filedata = fread($fh, $bytes); switch($type){ case self::WRITE : $newdata = $data; // no data manipulation needed, overwriting file break; case self::APPEND : $newdata = $filedata.$data; // place data at end of file break; case self::PREPEND : $newdata = $data.$filedata; // place data at beginning of file break; case self::INSERT_RX: if(!is_int($arg["multiple"])) $arg["multiple"] = 1; // number of occurrences to be replaced if(($newdata = preg_replace($arg["pattern"], $data, $filedata, $arg["multiple"])) === NULL) return self::Error("Could not replace data", 5200); break; case self::INSERT : if(!$arg || !is_int($arg)) return self::Error("Linenumber not found", 5200); $lines = file($filename); if(count($lines) == 0) $newdata = $data; else if($arg > count($lines)) $newdata = $filedata.$data; else { $newdata = ""; for($i = 0; $i < count($lines); $i++){ $newdata .= $lines[$i]; if($i == ($arg-1)) $newdata .= $data; } } break; } if($newdata == "") $newdata = "\n"; $result = false; ftruncate($fh, 0); rewind($fh); $result = fwrite($fh, $newdata); self::close($fh); if(!$result) return self::Error("Could not write to file.", 5201); return true; } } |
In een debug sessie werd bij alle aanroepen van prepend en append het bestand wel volledig ingelezen en klopte de gegevens voordat ze weggeschreven zouden worden.
telefoontoestel