# FileOutputStream.class.php

Go to the documentation of this file.

    00001 <?php
    00002 /***************************************************************************
    00003  *   Copyright (C) 2007-2009 by Ivan Y. Khvostishkov                       *
    00004  *                                                                         *
    00005  *   This program is free software; you can redistribute it and/or modify  *
    00006  *   it under the terms of the GNU Lesser General Public License as        *
    00007  *   published by the Free Software Foundation; either version 3 of the    *
    00008  *   License, or (at your option) any later version.                       *
    00009  *                                                                         *
    00010  ***************************************************************************/
    00011
    00015     final class FileOutputStream extends OutputStream
    00016     {
    00017         private $fd     = null;
    00018
    00019         public function __construct($nameOrFd, $append = false)
    00020         {
    00021             if (is_resource($nameOrFd)) {
    00022                 if (get_resource_type($nameOrFd) !== 'stream')
    00023                     throw new IOException('not a file resource');
    00024
    00025                 $this->fd = $nameOrFd;
    00026
    00027             } else {
    00028                 try {
    00029                     $this->fd = fopen($nameOrFd, ($append ? 'a' : 'w').'b');
    00030
    00031                     Assert::isNotFalse(
    00032                         $this->fd,
    00033                         "File {$nameOrFd} must be exist"
    00034                     );
    00035                 } catch (BaseException $e) {
    00036                     throw new IOException($e->getMessage());
    00037                 }
    00038             }
    00039         }
    00040
    00041         public function __destruct()
    00042         {
    00043             try {
    00044                 $this->close();
    00045             } catch (BaseException $e) {
    00046                 // boo.
    00047             }
    00048         }
    00049
    00053         public static function create($nameOrFd, $append = false)
    00054         {
    00055             return new self($nameOrFd, $append);
    00056         }
    00057
    00061         public function write($buffer)
    00062         {
    00063             if (!$this->fd || $buffer === null)
    00064                 return $this;
    00065
    00066             try {
    00067                 $written = fwrite($this->fd, $buffer);
    00068             } catch (BaseException $e) {
    00069                 throw new IOException($e->getMessage());
    00070             }
    00071
    00072             if (!$written || $written < strlen($buffer))
    00073                 throw new IOException('disk full and/or buffer too large?');
    00074
    00075             return $this;
    00076         }
    00077
    00081         public function close()
    00082         {
    00083             fclose($this->fd);
    00084
    00085             $this->fd = null;
    00086
    00087             return $this;
    00088         }
    00089     }
    00090 ?>