diff --git a/src/os/file/FileReader.php b/src/os/file/FileReader.php index b62552d..e08e215 100644 --- a/src/os/file/FileReader.php +++ b/src/os/file/FileReader.php @@ -6,7 +6,7 @@ use nur\sery\os\IOException; /** * Class FileReader: un fichier accédé en lecture */ -class FileReader extends Stream { +class FileReader extends _File { const DEFAULT_MODE = "rb"; function __construct($input, ?string $mode=null, bool $throwOnError=true, ?bool $allowLocking=null) { @@ -17,25 +17,13 @@ class FileReader extends Stream { $fd = $input; $close = false; } else { + $file = $input; if ($mode === null) $mode = static::DEFAULT_MODE; - $this->file = $input; + $this->file = $file; $this->mode = $mode; $fd = null; $close = true; } parent::__construct($fd, $close, $throwOnError, $allowLocking); } - - /** @var string */ - protected $file; - - /** @var string */ - protected $mode; - - function getResource() { - if ($this->fd === null && $this->file !== null) { - $this->fd = IOException::ensure_value(@fopen($this->file, $this->mode)); - } - return parent::getResource(); - } } diff --git a/src/os/file/FileWriter.php b/src/os/file/FileWriter.php index 968d0ea..e73ddc1 100644 --- a/src/os/file/FileWriter.php +++ b/src/os/file/FileWriter.php @@ -3,11 +3,12 @@ namespace nur\sery\os\file; use nur\sery\os\IOException; use nur\sery\os\sh; +use nur\sery\web\http; /** * Class FileWriter: un fichier accédé en lecture/écriture */ -class FileWriter extends Stream { +class FileWriter extends _File { const DEFAULT_MODE = "a+b"; function __construct($output, ?string $mode=null, bool $throwOnError=true, ?bool $allowLocking=null) { @@ -18,26 +19,14 @@ class FileWriter extends Stream { $fd = $output; $close = false; } else { + $file = $output; if ($mode === null) $mode = static::DEFAULT_MODE; - $this->file = $output; + IOException::ensure_value(sh::mkdirof($file)); + $this->file = $file; $this->mode = $mode; $fd = null; $close = true; } parent::__construct($fd, $close, $throwOnError, $allowLocking); } - - /** @var string */ - protected $file; - - /** @var string */ - protected $mode; - - function getResource() { - if ($this->fd === null && $this->file !== null) { - IOException::ensure_value(sh::mkdirof($this->file)); - $this->fd = IOException::ensure_value(@fopen($this->file, $this->mode)); - } - return parent::getResource(); - } } diff --git a/src/os/file/MemoryStream.php b/src/os/file/MemoryStream.php new file mode 100644 index 0000000..5622111 --- /dev/null +++ b/src/os/file/MemoryStream.php @@ -0,0 +1,13 @@ +getResource(); + $destr = $dest->getResource(); + if ($srcr !== null && $destr !== null) { + while (!feof($srcr)) { + fwrite($destr, fread($srcr, 8192)); + } + } else { + $dest->fwrite($this->getContents(false)); + } + if ($closeWriter) $dest->close(); + if ($closeReader) $this->close(); + } + ############################################################################# # Reader @@ -117,7 +131,13 @@ class Stream extends AbstractIterator implements IReader, IWriter { return IOException::ensure_value(fread($fd, $length), $this->throwOnError); } - /** @throws IOException */ + /** + * lire la prochaine ligne. la ligne est retournée avec le caractère de fin + * de ligne[\r]\n + * + * @throws EOFException si plus aucune ligne n'est disponible + * @throws IOException si une erreur se produit + */ function fgets(?int $length=null): string { $fd = $this->getResource(); return EOFException::ensure_not_eof(fgets($fd, $length), $this->throwOnError); @@ -129,10 +149,22 @@ class Stream extends AbstractIterator implements IReader, IWriter { return IOException::ensure_value(fpassthru($fd), $this->throwOnError); } + /** + * lire la prochaine ligne. la ligne est retournée *sans* le caractère de fin + * de ligne [\r]\n + * + * @throws EOFException si plus aucune ligne n'est disponible + * @throws IOException si une erreur se produit + */ function readLine(): ?string { return str::strip_nl($this->fgets()); } + /** lire et retourner toutes les lignes */ + function readLines(): array { + return iterator_to_array($this); + } + /** * 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 diff --git a/src/os/file/TempStream.php b/src/os/file/TempStream.php new file mode 100644 index 0000000..8fa308f --- /dev/null +++ b/src/os/file/TempStream.php @@ -0,0 +1,17 @@ +file) !== false; - } } diff --git a/src/os/file/_File.php b/src/os/file/_File.php new file mode 100644 index 0000000..d9ee42b --- /dev/null +++ b/src/os/file/_File.php @@ -0,0 +1,31 @@ +fd === null && $this->file !== null) { + $this->fd = IOException::ensure_value(@fopen($this->file, $this->mode)); + } + return parent::getResource(); + } + + /** streamer le contenu du fichier en sortie */ + function readfile(?string $contentType=null, ?string $charset=null, ?string $filename=null, string $disposition=null): bool { + if ($contentType !== null) http::content_type($contentType, $charset); + if ($filename !== null) http::download_as($filename, $disposition); + return readfile($this->file) !== false; + } +}