Position actuelle: Accueil> Derniers articles> Utilisez Stream_get_Meta_Data pour vérifier où le flux de fichiers est actuellement lu, comment le faire?

Utilisez Stream_get_Meta_Data pour vérifier où le flux de fichiers est actuellement lu, comment le faire?

gitbox 2025-09-21

Dans PHP, la fonction Stream_get_Meta_Data () est généralement utilisée pour obtenir les métadonnées d'un flux de fichiers, qui peut fournir des informations détaillées sur le flux de fichiers, y compris l'état du flux, le décalage et l'emplacement du pointeur de fichier. En utilisant cette fonction, les développeurs peuvent facilement vérifier où le flux de fichiers actuel est lu, en particulier lors du traitement des fichiers. Comprendre la position du pointeur de fichiers nous aide à contrôler plus efficacement la lecture et l'écriture de fichiers.

1. Introduction à Stream_get_Meta_Data () Fonction

La fonction Stream_get_Meta_Data () peut renvoyer certaines métadonnées du flux de fichiers. Ces informations incluent l'état du flux de fichiers, le mode d'ouverture, l'emplacement de lecture actuel, etc. Sa syntaxe est la suivante:

 <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>

paramètre:

  • $ Stream : doit être une ressource de flux de fichiers valide.

Valeur de retour:

  • Renvoie un tableau contenant les métadonnées pertinentes du flux de fichiers, telles que:

    • TIMED_OUT : Retour True si l'opération de flux a expiré.

    • Bloqué : retourne vrai si le flux est bloqué.

    • EOF : Renvoie True si le flux a atteint la fin du fichier.

    • Unred_bytes : le nombre d'octets non lus dans le flux actuel.

    • SECHABLE : s'il est possible de passer à un emplacement spécifique dans le fichier.

    • URI : L'URI du fichier.

    • MODE : Mode ouvrir le flux de fichiers (par exemple, R , W , etc.).

    • Stream_Type : le type de flux, généralement du flux .

    • wrapper_data : données de l'emballage (le cas échéant).

    • wrapper_type : le type de wrapper du flux (le cas échéant).

2. Obtenez l'emplacement de lecture du flux de fichiers

L'emplacement de lecture du flux de fichiers peut être appris en vérifiant les informations non mangées ou les informations de recherche dans les métadonnées retournées.

exemple:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>

</span><span><span class="hljs-comment">// Ouvrez le flux de fichiers</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">// Vérifiez les métadonnées du flux de fichiers</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">// Obtenir l&#39;emplacement du pointeur de fichier</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Le flux de fichiers est-il actuellement lisible?: "</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">'Oui'</span></span><span> : </span><span><span class="hljs-string">'Non'</span></span><span>) . PHP_EOL;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Nombre d&#39;octets non lus par le flux de fichiers: "</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">// Fermez le flux de fichiers</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">?&gt;</span></span><span>
</span></span>

3. Utilisez ftell () pour obtenir la position actuelle du pointeur de fichier

En plus d'obtenir des informations d'état de flux via Stream_get_Meta_Data () , nous pouvons également obtenir l'emplacement du pointeur de fichier actuel via la fonction intégrée de PHP Ftell () . La fonction ftell () renvoie le décalage de la position de lecture actuelle, en octets.

exemple:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>

</span><span><span class="hljs-comment">// Ouvrir le fichier</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">// Lire du contenu</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">// Obtenez l&#39;emplacement actuel du pointeur de fichier</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">"L&#39;emplacement actuel du pointeur de fichier: "</span></span><span> . </span><span><span class="hljs-variable">$position</span></span><span> . </span><span><span class="hljs-string">" octet"</span></span><span> . PHP_EOL;

</span><span><span class="hljs-comment">// Fermez le fichier</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">?&gt;</span></span><span>
</span></span>

4. Scénarios d'application pratiques de flux de fichiers

4.1 Suivi en temps réel des progrès de la lecture des fichiers

Lorsque vous travaillez avec des fichiers volumineux, il peut être nécessaire de suivre la progression de la lecture des fichiers en temps réel. Par exemple, lors de l'importation d'un grand fichier, nous pouvons utiliser Stream_get_meta_data () pour obtenir l'emplacement du pointeur de fichier et afficher la barre de progression dynamiquement.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>

</span><span><span class="hljs-comment">// Ouvrir un grand fichier</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">// 获取文件的总octet数</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">// 初始化读取的octet数</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">// Lire le fichier ligne par ligne</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">// 更新已读取的octet数</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">// Calculer les progrès</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">// Montrer les progrès</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Lire les progrès: "</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">// Fermez le fichier</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">?&gt;</span></span><span>
</span></span>

4.2 Gestion des erreurs et jugement de fin de fichier

Parfois, nous devons déterminer si le fichier a atteint la fin lors de la lecture. Utilisez les informations EOF renvoyées par Stream_get_Meta_Data () pour déterminer facilement si le fichier a été entièrement lu.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>

</span><span><span class="hljs-comment">// Ouvrez le flux de fichiers</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">// Lire le fichier ligne par ligne直到文件末尾</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">// Obtenez des métadonnées de flux de fichiers</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">// 判断OuiNon已到达文件末尾</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">"Le fichier a été lu à la fin"</span></span><span> . PHP_EOL;
}

</span><span><span class="hljs-comment">// Fermez le fichier</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">?&gt;</span></span><span>
</span></span>

5. Résumé

Stream_get_meta_data () est un outil très utile, surtout lorsqu'il s'agit de flux de fichiers. Grâce à lui, les développeurs peuvent non seulement vérifier l'état du flux de fichiers, mais également surveiller davantage l'emplacement du pointeur de fichier et si le flux de fichiers est lisible. Combiné avec d'autres fonctions de fonctionnement de fichiers (telles que ftell () et fseek () ), vous pouvez contrôler plus efficacement les opérations de lecture de fichiers, ce qui est particulièrement utile lors du traitement des fichiers volumineux.