115 lines
3.1 KiB
PHP
115 lines
3.1 KiB
PHP
|
<?php
|
||
|
namespace nur;
|
||
|
|
||
|
use nur\b\io\IOException;
|
||
|
use nur\b\io\SharedFile;
|
||
|
|
||
|
/**
|
||
|
* Class file: méthodes outils pour gérer les fichiers avec support des
|
||
|
* exceptions
|
||
|
*/
|
||
|
class file {
|
||
|
/** générer un nom de fichier temporaire avec le préfixe spécifié */
|
||
|
static function temp(string $prefix, ?string $tmpdir=null): string {
|
||
|
if ($tmpdir === null) $tmpdir = sys_get_temp_dir();
|
||
|
return IOException::ensure_not_false(tempnam($tmpdir, $prefix));
|
||
|
}
|
||
|
|
||
|
/** copier le fichier $src sur $dest */
|
||
|
static function copy(string $src, string $dest, bool $overwrite=true): bool {
|
||
|
if (!$overwrite && file_exists($dest)) {
|
||
|
throw new IOException("$dest: fichier existant");
|
||
|
}
|
||
|
return IOException::ensure_not_false(copy($src, $dest));
|
||
|
}
|
||
|
|
||
|
/** obtenir une instance permettant un accès concurrent au fichier spécifié */
|
||
|
static function with(string $file): SharedFile {
|
||
|
return new SharedFile($file);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param resource $context
|
||
|
* @return resource
|
||
|
* @throws IOException
|
||
|
*/
|
||
|
static function open(string $filename, string $mode, bool $use_include_path=false, $context=null) {
|
||
|
return IOException::ensure_not_false(fopen($filename, $mode, $use_include_path, $context));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param resource $stream
|
||
|
* @throws IOException
|
||
|
*/
|
||
|
static function tell($stream): int {
|
||
|
return IOException::ensure_not_false(ftell($stream));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param resource $stream
|
||
|
* @return int la position après avoir déplacé le pointeur
|
||
|
* @throws IOException
|
||
|
*/
|
||
|
static function seek($stream, int $offset, int $whence=SEEK_SET): int {
|
||
|
$r = fseek($stream, $offset, $whence);
|
||
|
if ($r == -1) throw IOException::error();
|
||
|
return self::tell($stream);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param resource $stream
|
||
|
* @throws IOException
|
||
|
*/
|
||
|
static function read($stream, int $length): string {
|
||
|
return IOException::ensure_not_false(fread($stream, $length));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param resource $stream
|
||
|
* @throws IOException
|
||
|
*/
|
||
|
static function fgets($stream, ?int $length=null): string {
|
||
|
return IOException::ensure_not_false(fgets($stream, $length));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* à partir de la position $pos, trouver le premier caractère \n et retourner
|
||
|
* la position juste après
|
||
|
*/
|
||
|
static function find_nl($stream, int $pos): int {
|
||
|
self::seek($stream, $pos, SEEK_SET);
|
||
|
while (true) {
|
||
|
$data = self::read($stream, 512);
|
||
|
if ($data === "") return $pos + 1;
|
||
|
$nlpos = strpos($data, "\n");
|
||
|
if ($nlpos !== false) {
|
||
|
$pos += $nlpos + 1;
|
||
|
break;
|
||
|
} else {
|
||
|
$pos += strlen($data);
|
||
|
}
|
||
|
}
|
||
|
return $pos;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param resource $stream
|
||
|
* @throws IOException
|
||
|
*/
|
||
|
static function write($stream, string $data, ?int $length=null): int {
|
||
|
if ($length === null) $result = fwrite($stream, $data);
|
||
|
else $result = fwrite($stream, $data, $length);
|
||
|
return IOException::ensure_not_false($result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param resource $stream
|
||
|
* @throws IOException
|
||
|
*/
|
||
|
static function close($stream, bool $throw=false): bool {
|
||
|
$closed = fclose($stream);
|
||
|
if ($closed || !$throw) return $closed;
|
||
|
else throw IOException::error();
|
||
|
}
|
||
|
}
|