php에서 stream_get_meta_data () 함수는 일반적으로 파일 스트림의 메타 데이터를 가져 오는 데 사용되며, 스트림의 상태, 오프셋 및 파일 포인터의 위치를 포함하여 파일 스트림에 대한 자세한 정보를 제공 할 수 있습니다. 이 기능을 사용하여 개발자는 특히 파일을 처리 할 때 현재 파일 스트림을 읽을 수있는 위치를 쉽게 확인할 수 있습니다. 파일 포인터 위치를 이해하면 파일의 읽기 및 쓰기를보다 효율적으로 제어 할 수 있습니다.
stream_get_meta_data () 함수는 파일 스트림의 일부 메타 데이터를 반환 할 수 있습니다. 이 정보는 파일 스트림의 상태, 오프닝 모드, 현재 읽기 위치 등이 포함됩니다. 구문은 다음과 같습니다.
<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 : 유효한 파일 스트림 리소스 여야합니다.
파일 스트림의 관련 메타 데이터가 포함 된 배열을 반환합니다.
timed_out : 스트림 조작이 시간이 초과되면 true를 반환합니다.
차단 : 스트림이 차단되면 True를 반환하십시오.
EOF : 스트림이 파일의 끝에 도달하면 true를 반환합니다.
UNREAD_BYTES : 현재 스트림에서 읽지 않은 바이트 수입니다.
찾기 가능 : 파일의 특정 위치로 이동할 수 있는지 여부.
URI : 파일의 URI.
모드 : 파일 스트림의 열기 모드 (예 : r , w 등).
stream_type : 스트림 유형, 일반적으로 스트림 .
WRAPPER_DATA : 래퍼의 데이터 (있는 경우).
WRAPPER_TYPE : 스트림의 래퍼 유형 (있는 경우).
파일 스트림의 읽기 위치는 반환 된 메타 데이터에서 unread_bytes 또는 찾을 수있는 정보를 확인하여 배울 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 파일 스트림을 엽니 다</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">// 파일 스트림의 메타 데이터를 확인하십시오</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">// 파일 포인터 위치를 얻습니다</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"파일 스트림은 현재 읽을 수 있습니까?: "</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">'예'</span></span><span> : </span><span><span class="hljs-string">'아니요'</span></span><span>) . PHP_EOL;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"파일 스트림에서 읽지 않은 바이트 수입니다: "</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">// 파일 스트림을 닫습니다</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 () 를 통해 일부 스트림 상태 정보를 얻는 것 외에도 PHP의 내장 기능 ftell ()을 통해 현재 파일 포인터의 위치를 얻을 수도 있습니다. ftell () 함수는 현재 읽기 위치의 오프셋을 바이트로 반환합니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 파일을 엽니 다</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">// 일부 내용을 읽으십시오</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">// 현재 파일 포인터 위치를 가져옵니다</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">"현재 파일 포인터 위치: "</span></span><span> . </span><span><span class="hljs-variable">$position</span></span><span> . </span><span><span class="hljs-string">" 바이트"</span></span><span> . PHP_EOL;
</span><span><span class="hljs-comment">// 파일을 닫습니다</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 ()를 사용하여 파일 포인터의 위치를 가져 와서 진행률 표시 줄을 동적으로 표시 할 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 큰 파일을 엽니 다</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">// 获取文件的总바이트数</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">// 初始化读取的바이트数</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">// 파일을 한 줄씩 읽으십시오</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">// 更新已读取的바이트数</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">// 진행 상황을 계산합니다</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">// 진행 상황을 보여줍니다</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"진행 상황을 읽으십시오: "</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">// 파일을 닫습니다</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 () 가 반환 한 EOF 정보를 사용하여 파일을 완전히 읽었는지 쉽게 확인하십시오.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 파일 스트림을 엽니 다</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">// 파일을 한 줄씩 읽으십시오直到文件末尾</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">// 파일 스트림 메타 데이터를 얻습니다</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">// 判断예아니요已到达文件末尾</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">"파일은 끝까지 읽었습니다"</span></span><span> . PHP_EOL;
}
</span><span><span class="hljs-comment">// 파일을 닫습니다</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 ()는 특히 파일 스트림을 처리 할 때 매우 유용한 도구입니다. 이를 통해 개발자는 파일 스트림의 상태를 확인할뿐만 아니라 파일 포인터의 위치와 파일 스트림을 읽을 수 있는지 여부를 더 모니터링 할 수 있습니다. 다른 파일 작동 함수 (예 : ftell () 및 fseek () )과 결합하여 파일 읽기 작업을보다 효율적으로 제어 할 수 있으며, 이는 큰 파일을 처리 할 때 특히 유용합니다.