diff --git a/src/file/IReader.php b/src/file/IReader.php index 3936d3f..b0ff2c8 100644 --- a/src/file/IReader.php +++ b/src/file/IReader.php @@ -17,6 +17,8 @@ interface IReader extends _IFile { /** @throws IOException */ function fpassthru(): int; + function fgetcsv(): ?array; + /** * lire la prochaine ligne. la ligne est retournée *sans* le caractère de fin * de ligne [\r]\n @@ -26,19 +28,6 @@ interface IReader extends _IFile { */ function readLine(): ?string; - /** - * essayer de verrouiller le fichier en lecture. retourner true si l'opération - * réussit. dans ce cas, il faut appeler {@link getReader()} avec l'argument - * true - */ - function canRead(): bool; - - /** - * verrouiller en mode partagé puis retourner un objet permettant de lire le - * fichier. - */ - function getReader(bool $alreadyLocked=false): IReader; - /** * lire tout le contenu du fichier en une seule fois, puis, si $close==true, * le fermer @@ -49,4 +38,6 @@ interface IReader extends _IFile { /** désérialiser le contenu du fichier, puis, si $close===true, le fermer */ function unserialize(?array $options=null, bool $close=true, bool $alreadyLocked=false); + + function copyTo(IWriter $dest, bool $closeWriter=false, bool $closeReader=true): void; } diff --git a/src/file/IWriter.php b/src/file/IWriter.php index afc7f5c..a47c772 100644 --- a/src/file/IWriter.php +++ b/src/file/IWriter.php @@ -7,31 +7,21 @@ use nur\sery\os\IOException; * Interface IWriter: un objet dans lequel on peut écrire des données */ interface IWriter extends _IFile { + /** @throws IOException */ + function ftruncate(int $size): self; + /** @throws IOException */ function fwrite(string $data, int $length=0): int; + /** @throws IOException */ + function fputcsv(array $row): void; + /** @throws IOException */ function fflush(): self; - /** @throws IOException */ - function ftruncate(int $size): self; - /** afficher les lignes */ function writeLines(?iterable $lines): self; - /** - * essayer de verrouiller le fichier en écriture. retourner true si l'opération - * réussit. dans ce cas, il faut appeler {@link getWriter()} avec l'argument - * true - */ - function canWrite(): bool; - - /** - * verrouiller en mode exclusif puis retourner un objet permettant d'écrire - * dans le fichier - */ - function getWriter(bool $alreadyLocked=false): IWriter; - /** écrire le contenu spécifié dans le fichier */ function putContents(string $contents, bool $close=true, bool $alreadyLocked=false): void; diff --git a/src/file/Stream.php b/src/file/Stream.php index 6d26b9f..c8a4c16 100644 --- a/src/file/Stream.php +++ b/src/file/Stream.php @@ -259,13 +259,14 @@ class Stream extends AbstractIterator implements IReader, IWriter { return new class($this->fd, ++$this->serial, $this) extends Stream { function __construct($fd, int $serial, Stream $parent) { $this->parent = $parent; + $this->serial = $serial; parent::__construct($fd); } /** @var Stream */ private $parent; - function close(bool $close=true): void { + function close(bool $close=true, ?int $ifSerial=null): void { if ($this->parent !== null && $close) { $this->parent->close(true, $this->serial); $this->fd = null; @@ -315,6 +316,14 @@ class Stream extends AbstractIterator implements IReader, IWriter { ############################################################################# # Writer + /** @throws IOException */ + function ftruncate(int $size=0, bool $rewind=true): self { + $fd = $this->getResource(); + IOException::ensure_valid(ftruncate($fd, $size), $this->throwOnError); + if ($rewind) rewind($fd); + return $this; + } + /** @throws IOException */ function fwrite(string $data, ?int $length=null): int { $fd = $this->getResource(); @@ -323,6 +332,7 @@ class Stream extends AbstractIterator implements IReader, IWriter { return IOException::ensure_valid($r, $this->throwOnError); } + /** @throws IOException */ function fputcsv(array $row): void { $fd = $this->getResource(); $params = $this->getCsvParams($fd); @@ -336,14 +346,6 @@ class Stream extends AbstractIterator implements IReader, IWriter { return $this; } - /** @throws IOException */ - function ftruncate(int $size=0, bool $rewind=true): self { - $fd = $this->getResource(); - IOException::ensure_valid(ftruncate($fd, $size), $this->throwOnError); - if ($rewind) rewind($fd); - return $this; - } - function writeLines(?iterable $lines): IWriter { if ($lines !== null) { foreach ($lines as $line) { @@ -388,7 +390,7 @@ class Stream extends AbstractIterator implements IReader, IWriter { /** @var Stream */ private $parent; - function close(bool $close=true): void { + function close(bool $close=true, ?int $ifSerial=null): void { if ($this->parent !== null && $close) { $this->parent->close(true, $this->serial); $this->fd = null;