In PHP wird die Funktion von Stream_Get_Meta_Data () normalerweise verwendet, um die Metadaten eines Dateistroms zu erhalten, mit dem detaillierte Informationen zum Dateistrom, einschließlich des Status des Streams, des Offsets und des Ortes des Dateizeigers, detaillierte Informationen bereitgestellt werden können. Mit dieser Funktion können Entwickler leicht überprüfen, wo der aktuelle Dateistrom gelesen wird, insbesondere bei der Verarbeitung von Dateien. Das Verständnis der Dateizeigerposition hilft uns, das Lesen und Schreiben von Dateien effizienter zu steuern.
Die Funktion von Stream_Get_Meta_Data () kann einige Metadaten des Dateistroms zurückgeben. Diese Informationen umfassen den Status des Dateistroms, den Öffnungsmodus, den aktuellen Leseort usw. Die Syntax lautet wie folgt:
<span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(resource </span><span><span class="hljs-variable">$stream</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>$ stream : Muss eine gültige Dateistrom -Ressource sein.
Gibt ein Array zurück, das die relevanten Metadaten des Dateistroms enthält, z. B.:
TimED_OUT : RECHT TRUE , wenn der Stream -Operation abgelaufen ist.
Blockiert : Return true , wenn der Stream blockiert ist.
EOF : Gibt true zurück, wenn der Stream das Ende der Datei erreicht hat.
Unread_Bytes : Die Anzahl der Bytes, die im aktuellen Stream nicht gelesen werden.
Seekable : Ob möglich, zu einem bestimmten Ort in der Datei zu springen.
URI : Der URI der Datei.
Modus : Öffnen Sie den Modus des Dateistroms (z. B. r , w usw.).
Stream_type : Der Streamtyp, normalerweise Stream .
WRAPPER_DATA : Daten des Wrappers (falls vorhanden).
WRAPPER_TYPE : Der Wrapper -Typ des Streams (falls vorhanden).
Der gelesene Speicherort des Dateistroms kann gelernt werden, indem Sie die unread_bytes oder die suchbaren Informationen in den zurückgegebenen Metadaten überprüfen.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Öffnen Sie den Dateistrom</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-comment">// Überprüfen Sie die Metadaten des Dateistroms</span></span><span>
</span><span><span class="hljs-variable">$metaData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-comment">// Holen Sie sich den Speicherort Dateizeiger</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Ist der Dateistrom derzeit lesbar?: "</span></span><span> . (</span><span><span class="hljs-variable">$metaData</span></span><span>[</span><span><span class="hljs-string">'seekable'</span></span><span>] ? </span><span><span class="hljs-string">'Ja'</span></span><span> : </span><span><span class="hljs-string">'NEIN'</span></span><span>) . PHP_EOL;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Anzahl der Bytes, die nicht vom Dateistrom gelesen werden: "</span></span><span> . </span><span><span class="hljs-variable">$metaData</span></span><span>[</span><span><span class="hljs-string">'unread_bytes'</span></span><span>] . PHP_EOL;
</span><span><span class="hljs-comment">// Schließen Sie den Dateistrom</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Zusätzlich zum Erhalt einiger Stream-Statusinformationen über Stream_Get_Meta_Data () können wir den Speicherort des aktuellen Dateizeigers über die integrierte Funktion von PHP () erhalten. Die Funktion ftell () gibt den Versatz der aktuellen Leseposition in Bytes zurück.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Öffnen Sie die Datei</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-comment">// Lesen Sie einige Inhalte</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-comment">// Holen Sie sich den Standort des aktuellen Dateizeigers</span></span><span>
</span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftell</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Der aktuelle Standort des Dateizeigers: "</span></span><span> . </span><span><span class="hljs-variable">$position</span></span><span> . </span><span><span class="hljs-string">" Byte"</span></span><span> . PHP_EOL;
</span><span><span class="hljs-comment">// Schließen Sie die Datei</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Bei der Arbeit mit großen Dateien kann es erforderlich sein, den Fortschritt der Dateilesung in Echtzeit zu verfolgen. Zum Beispiel können wir beim Importieren einer großen Datei Stream_get_meta_data () verwenden, um den Speicherort des Dateizeigers zu erhalten und die Fortschrittsleiste dynamisch anzuzeigen.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Öffnen Sie eine große Datei</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-comment">// 获取文件的总Byte数</span></span><span>
</span><span><span class="hljs-variable">$fileSize</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filesize</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>);
</span><span><span class="hljs-comment">// 初始化读取的Byte数</span></span><span>
</span><span><span class="hljs-variable">$readBytes</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-comment">// Lesen Sie die Dateizeile nach Zeile</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-comment">// 更新已读取的Byte数</span></span><span>
</span><span><span class="hljs-variable">$readBytes</span></span><span> += </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$line</span></span><span>);
</span><span><span class="hljs-comment">// Fortschritt berechnen</span></span><span>
</span><span><span class="hljs-variable">$progress</span></span><span> = (</span><span><span class="hljs-variable">$readBytes</span></span><span> / </span><span><span class="hljs-variable">$fileSize</span></span><span>) * </span><span><span class="hljs-number">100</span></span><span>;
</span><span><span class="hljs-comment">// Fortschritte zeigen</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Fortschritte lesen: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">round</span></span><span>(</span><span><span class="hljs-variable">$progress</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>) . </span><span><span class="hljs-string">"%\r"</span></span><span>;
}
</span><span><span class="hljs-comment">// Schließen Sie die Datei</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Manchmal müssen wir feststellen, ob die Datei beim Lesen das Ende erreicht hat. Verwenden Sie die von stream_get_meta_data () zurückgegebenen EOF -Informationen, um fest zu bestimmen, ob die Datei vollständig gelesen wurde.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Öffnen Sie den Dateistrom</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-comment">// Lesen Sie die Dateizeile nach Zeile直到文件末尾</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$line</span></span><span>;
}
</span><span><span class="hljs-comment">// Holen Sie sich Dateistream -Metadaten</span></span><span>
</span><span><span class="hljs-variable">$metaData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-comment">// 判断JaNEIN已到达文件末尾</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$metaData</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>]) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Die Datei wurde bis zum Ende gelesen"</span></span><span> . PHP_EOL;
}
</span><span><span class="hljs-comment">// Schließen Sie die Datei</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>stream_get_meta_data () ist ein sehr nützliches Tool, insbesondere beim Umgang mit Dateiströmen. Dadurch können Entwickler nicht nur den Status des Dateistroms überprüfen, sondern auch den Speicherort des Dateizeigers und darüber, ob der Dateistrom lesbar ist, weiter überwachen. In Kombination mit anderen Dateibetriebsfunktionen (z. B. ftell () und fseek () ) können Sie effizienter Dateilesungsvorgänge steuern, was bei der Verarbeitung großer Dateien besonders nützlich ist.