1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 15:52:13 +01:00
Files
2026-02-06 10:42:15 +03:00

200 lines
5.8 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e652ed93a5ba1f87c8f2058ff2bdfe626cf4a560 Maintainer: tmn Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="streamwrapper.dir-readdir" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>streamWrapper::dir_readdir</refname>
<refpurpose>Чтение записи из дескриптора директории</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type class="union"><type>string</type><type>bool</type></type><methodname>streamWrapper::dir_readdir</methodname>
<void />
</methodsynopsis>
<para>
Этот метод вызывается в процессе выполнения <function>readdir</function>.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Должна возвращать строку (<type>string</type>), представляющую
имя следующего файла, либо &false;, если следующего файла нет.
</para>
<warning>
<simpara>
Возвращение значения <type>true</type> или <type>false</type> будет иметь тот же эффект,
что и сигнал об отсутствии следующего файла.
Однако возвращение значения <type>true</type> не рекомендуется,
и вместо этого следует использовать значение <type>false</type>
для сигнализации об этом состоянии.
</simpara>
</warning>
<note>
<para>
Возвращаемое значение не логического типа будет преобразовано в строку (<type>string</type>).
</para>
</note>
</refsect1>
<refsect1 role="errors"><!-- {{{ -->
&reftitle.errors;
&userstream.not.implemented.warning;
</refsect1><!-- }}} -->
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Получение списка файлов из tar-архивов</title>
<programlisting role="php">
<![CDATA[
<?php
class streamWrapper {
protected $fp;
public function dir_opendir($path, $options) {
$url = parse_url($path);
$path = $url["host"] . $url["path"];
if (!is_readable($path)) {
trigger_error("Не могу прочитать $path ", E_USER_NOTICE);
return false;
}
if (!is_file($path)) {
trigger_error("$path не является файлом", E_USER_NOTICE);
return false;
}
$this->fp = fopen($path, "rb");
return true;
}
public function dir_readdir() {
// Извлечение заголовка
$header = fread($this->fp, 512);
$data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1filetype/a100link/a100linkedfile", $header);
// Убираем лишние пробелы в имени файла и его размере
$filename = trim($data["filename"]);
// Нет файла? Значит мы дошли до конца архива
if (!$filename) {
return false;
}
$octal_bytes = trim($data["size"]);
// Размер файла определён в восьмеричной системе
$bytes = octdec($octal_bytes);
// tar округляет размеры файлов, чтобы они были
// кратными 512 байтам (с заполнением нулями)
$rest = $bytes % 512;
if ($rest > 0) {
$bytes += 512 - $rest;
}
// Перемещаемся внутри файла
fseek($this->fp, $bytes, SEEK_CUR);
return $filename;
}
public function dir_closedir() {
return fclose($this->fp);
}
public function dir_rewinddir() {
return fseek($this->fp, 0, SEEK_SET);
}
}
stream_wrapper_register("tar", "streamWrapper");
$handle = opendir("tar://example.tar");
while (false !== ($file = readdir($handle))) {
var_dump($file);
}
echo "Перемотка в начало..\n";
rewind($handle);
var_dump(readdir($handle));
closedir($handle);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
string(13) "construct.xml"
string(16) "dir-closedir.xml"
string(15) "dir-opendir.xml"
string(15) "dir-readdir.xml"
string(17) "dir-rewinddir.xml"
string(9) "mkdir.xml"
string(10) "rename.xml"
string(9) "rmdir.xml"
string(15) "stream-cast.xml"
string(16) "stream-close.xml"
string(14) "stream-eof.xml"
string(16) "stream-flush.xml"
string(15) "stream-lock.xml"
string(15) "stream-open.xml"
string(15) "stream-read.xml"
string(15) "stream-seek.xml"
string(21) "stream-set-option.xml"
string(15) "stream-stat.xml"
string(15) "stream-tell.xml"
string(16) "stream-write.xml"
string(10) "unlink.xml"
string(12) "url-stat.xml"
Rewinding..
string(13) "construct.xml"
]]>
</screen>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>readdir</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->