PHP读取文件

file()-把整个文件读入一个数组中

file(string $filename, int $flag, resource $context=?):array
参数:

  • filename:文件的路径
  • flags:可选参数。可以是以下一个或多个常量。
    FILE_USE_INCLUDE_PATH
    FILE_IGNORE_NEW_LINES省略数组中每个元素末尾的换行符
    FILE_SKIP_EMPTY_LINES跳过空行
  • conntext
    返回值:返回数组形式的文件内容。数组的每个元素对应于文件中的一行(结尾会附加换行符)。失败时返回false。
    注意:除非使用了FILE_IGNORE_NEW_LINES,否则结果数据中的每一行都将包含行尾。
    错误/异常:如果文件不存在,则发出E_WARNING级错误。

file_get_contents-将整个文件读入一个字符串

file_get_contents(
            string $filename,
            bool $use_include_path = false,
            resource $context = ?,
            int $offset = 0,
            int $length = ?
        ):string|false

  和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 length 的内容。如果失败,file_get_contents() 将返回 false。
  file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。
注意:如果要打开有特殊字符的URL(比如空格),就需要使用urlencode()进行URL编码。
参数:

  • filename:要读取的文件名称
  • use_include_path context:stream_context_create()创建的有效的上下文(context)资源。如果你不需要自定义context,可以用null来忽略。
  • offset:读取原始数据流的开始位置偏移量。负的offset会从数据流的末尾开始统计。远程文件不支持偏移量寻址(offset)。对远程文件以较小的offset可能可以正常寻址,但是对缓冲流进行操作,所以操作结果不可预测。
  • length:要读取数据的最大长度。默认情况下会读到文件末尾。注意,该参数会应用到处理stream的过滤器(filter)中。

返回值:返回读取到的数据,或者在失败时返回false。
警告:此函数可能返回布尔值false,但也可能返回等同于false的非布尔值。应使用===运算符来测试此函数的返回值。
错误/异常:E_WARNING级别错误:无法找到filename文件;length小于0;在stream中无法寻址偏移量offset。Windows 下用 file_get_contents() 读取目录会导致 E_WARNING 错误。 PHP 7.4 起,其他操作系统也会出现同样错误。

fpassthru()输出文件指针处的所有剩余数据

fpassthru(resource $handle):int

  • 将给定的文件指针从当前的位置读取到EOF并把结果写到输出缓冲区。
  • 如果已经向文件写入数据,就必须调用rewind()来将文件指针指向文件头。
  • 如果既不修改文件也不在特定位置检索,只想将文件的内容下载到输出缓冲区,应该使用readfile(),这样可以省去fopen()调用。
    参数:
  • handle 文件指针必须是有效的,必须指向由fopen()或fsockopen()成功打开的文件(并还未由fclose()关闭)。
    返回值:从handle读取并传递到输出的字符数目。发生错误时,返回false。
$name = 'test.png';
$fp = fopen($name, 'rb');
header("Content-Type: image/png");
fpassthru($fp);
exit;

  当在windows系统中将fpassthru()用于二进制文件,要确保在用fopen()打开文件时在mode中附加了b来将文件以二进制方式打开。鼓励在处理二进制文件时使用b标志,即使系统并不需要,这样可以使脚本的移植性更好。

readfile()—输出文件

readfile(string $filename, bool $use_include_path = false, resource $context = ?):int
读取文件并写入输出缓冲
参数:

  • filename:要读取的文件名
  • use_include_path
  • context
    返回值:成功时返回从文件中读入的字节数,失败时返回false
    示例:使用readfile()强制下载
<?php
$file = 'test.txt';
if(file_exists($file)){
        header("Content-Description: File Transfer");
        header("Content-Type: application/octet-strem");
        header('Content-Disposition: attachment; filename="'.basename($name).'"');
        header('Expires: 0');//缓存过期时间
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($name));
        ob_clean();
        flush();
        readfile($name);
}
exit;

fgetcsv—从文件指针中读入一行并解析CSV字段

fgetcsv(resource $handle,
        int $length = 0,
        string $delimiter = ',',
        string $enclosure = '"',
       string $escape = '\\'):array

参数:
handle:一个由fopen()、popen()、或fsockopen()产生的有效文件指针。
length:必须大于CVS文件内最长的一行。在 PHP 5 中该参数是可选的。如果忽略(在 PHP 5.0.4 以后的版本中设为 0)该参数的话,那么长度就没有限制,不过可能会影响执行效率。
delimiter:设置字段分界符(只允许一个字符)。
enclosure:设置字段环绕符(只允许一个字符)。
escape:设置转义字符(只允许一个字符)。默认是一个反斜杠

返回值:返回包含读取字段的索引数组。

注意:

  • CSV文件中的空行将被返回为一个包含由单个null字段的数组,不会被当成错误。
  • 如果提供了无效的文件指针,fgetcsv()会返回null。其他错误,包括碰到文件结束时返回false。
  • 读取中文乱码,csv格式不是utf-8的,所以在读取和写入mysql的时候就会出现乱码,用iconv函数转换下即可。
            $fp = fopen('code.csv', 'rb');

            while (($list = fgetcsv($fp))!==false){
                echo '<pre>';
                foreach ($list as $v){
                    if ($v){
                        var_dump(iconv('gbk','utf-8',$v));
                    }
                }
            }

fgets—从文件指针中读取一行。

fgets(resource $handle, int $length = ?) : string

参数:
handle:文件指针必须是有效的,必须指向由 fopen() 或 fsockopen() 成功打开的文件(并还未由 fclose() 关闭)。
length:从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。

返回值:

  • 从指针 handle 指向的文件中读取了 length - 1 字节后返回字符串。如果文件指针中没有更多的数据了则返回 false。
  • 错误发生时返回 false。
$file = 'test.txt';
$handle = @fopen($file,'r');
if ($handle){
    while (($data = fgets($handle,40000))!==false){
        var_dump($data);
        echo '<br>';
    }
}

如果遇到乱码,用iconv转码。

fread—读取文件(可安全用于二进制文件)

fread(resource $handle, int $length):string
fread()从文件指针handle读取最多length个字节。
参数:

  • handle:文件系统指针,是典型地由fopen()创建的resource(资源)
  • length:最多读取length个字节。
    返回值:返回所读取的字符串,或则在失败时返回false。
$filename = 'test.txt';
//$filename = 'test.png';//也可以读取二进制文件
$fp = fopen($filename,'rb');
$contents = '';
$contents .= fread($fp,filesize($filename));
var_dump($contents);
fclose($fp);

读取远程文件返回的流时,读取会在一个包可用之后停止。可以如下方法
方法一:

$filename = 'http://www.baidu.com';
$fp = fopen($filename,'rb');
$contents = stream_get_contents($fp);
var_dump($contents);

方法二:

$filename = 'http://www.baidu.com';
$fp = fopen($filename,'rb');
$contents = '';
while (!feof($fp)){
    $contents .= fread($fp,8192);
}
var_dump($contents);
fclose($fp);

注意:如果只是想将一个文件的内容读入到一个字符串中,用 file_get_contents()。

fscanf—从文件中格式化输出

fscanf('resource $handle, string $format, mixed &$... = ?'):mixed
  fscanf()函数从与handle关联的文件中读取一行并根据指定的format来解释输入。
格式字符串中的任何空白会与输入流中的任何空白匹配。这意味着甚至格式字符串中的制表符\t也会与输入流中的一个空白字符匹配。
参数:

  • handle:文件系统指针,由fopen()创建的resource资源。
  • format:参数格式是sprintf()文档中所描述的格式。
    返回值:如果只传递了两个参数,解析后的值会被作为数组返回。否则,如果提供了可选参数,此函数将返回被赋值的数目。可选参数必须用引用传递。
$fp= fopen("test.txt", "r");
while ($userinfo = fscanf($fp, "%s\t%s\t%s\n")) {
    list ($name, $profession, $countrycode) = $userinfo;
}
fclose($handle);
$fp= fopen("test.txt", "r");
while ($userinfo = fscanf($fp, "%s\t%s\t%s\n",$name,$profession,$countrycode)) {
    
}
fclose($handle);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容