php文件读写

2021-09-16

文件读取/写入

//将整个文件读入一个字符串
file_get_contents(string $filename , bool $use_include_path = false , resource $context = ? , int $offset = -1 , int $maxlen = ?):string
    filename 要读取的文件的名称
    use_include_path 
    context 使用stream_context_create()创建的有效上下文资源
    offset 读取从原始流开始的偏移量。远程文件不支持查找(偏移量)。尝试在非本地文件上查找可能只需要很小的偏移量,但这是不可预测的,因为它只在缓冲流上工作
    maxlen 读取数据的最大长度。默认值是读取,直到到达文件的末尾。注意,此参数应用于过滤器处理的流。

//将一个字符串写入文件
file_put_contents(string $filename , mixed $data , int $flags = 0 , resource $context = ?):int
    filename 要被写入数据的文件名
    data 要写入的数据。类型可以是 string,array 或者是 stream 资源,如果 data 指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。参数 data 可以是数组(但不能为多维数组)
    flags 使用 OR (|) 运算符进行的组合
        FILE_USE_INCLUDE_PATH 在 include 目录里搜索 filename
        FILE_APPEND 如果文件 filename 已经存在,追加数据而不是覆盖
        LOCK_EX 	在写入时获得一个独占锁
    context 一个 context 资源。

文件读取

// 将filename指定的名字资源绑定到一个流上。
$fp = fopen($filename, $mode);

// 判断文件指针是否读取到文件结束的位置,未到时一直读取
while (!feof($fp)) {
    // 读取$length字节的数据
    $data1 = fread($fp, $length);
    
    // 读取一行(碰到换行符或EOF)或$length(默认1K)字节的数据
    $data2 = fgets($fp, $length);
    
    // 读取一行(碰到换行符或EOF)或$length(默认1K)字节的数据,去掉数据中的HTML和PHP标记($allowable_tags指定不需要去除的标记)
    $data3 = fgets($fp, $length, $allowable_tags);
}

// 关闭文件流
fclose($fp);

// $mode = [
//         'r'	只读方式打开,将文件指针指向文件头。
//         'r+'	读写方式打开,将文件指针指向文件头。
//         'w+'	读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
//         'a+'	读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
//         'x+'	创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,将返回false,如果文件不存在则尝试创建之。
//         'c+' 打开文件进行读写,文件指针位于文件的开头。如果文件不存在,则创建该文件。如果它存在,它既不会被截断(相对于'w'),也不会调用这个函数失败(就像'x'一样)。
// ];

文件写入

// $mode = [
//         'r+'	读写方式打开,将文件指针指向文件头。
//         'w'	写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
//         'w+'	读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
//         'a'	写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
//         'a+'	读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
//         'x'	创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,将返回false,如果文件不存在则尝试创建之。
//         'x+'	创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,将返回false,如果文件不存在则尝试创建之。
//         'c' 打开文件仅用于写入。如果文件不存在,则创建该文件。如果它存在,它既不会被截断(相对于'w'),也不会调用这个函数失败(就像'x'一样)。文件指针位于文件的开头。
//         'c+' 打开文件进行读写,如果文件不存在,则创建该文件。如果它存在,它既不会被截断(相对于'w'),也不会调用这个函数失败(就像'x'一样)。文件指针位于文件的开头。
// ];

// 将filename指定的名字资源绑定到一个流上。
$fp = fopen($filename, $mode);

// 在文件指针$fp处写入数据$string(fputs和fwrite相同),如果指定$length那么直写入$length长度的$string,剩余部分不写入
fputs($fp, $string, $length);
fwrite($fp, $string, $length);

// 关闭文件流
fclose($fp);

文件锁定

// 将filename指定的名字资源绑定到一个流上。
$fp = fopen($filename, $mode);

// $operation = [
//     LOCK_SH | LOCK_NB  取得共享锁定(读取的程序)且不阻塞,可以不指定LOCK_NB。
//     LOCK_EX | LOCK_NB  取得独占锁定(写入的程序)且不阻塞,可以不指定LOCK_NB。
//     LOCK_NB 锁定时不阻塞(windows不支持)
// ];
// $wouldblock 如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 true。(windows不支持)
// 文件加锁,成功返回true,失败返回false
flock($fp, $operation, $wouldblock);

// 解锁
flock($fp, LOCK_UN, $wouldblock);

// 关闭文件流
fclose($fp);

文件指针

// 将filename指定的名字资源绑定到一个流上。
$fp = fopen($filename, $mode);

// $whence = [
//     SEEK_SET 设定位置等于offset字节。
//     SEEK_CUR 设定位置为当前位置加上offset。
//     SEEK_END 设定位置为文件尾加上offset
// ];
// 指定文件指针位置,位置是$whence()和$offset(字节数)
fseek($fp, $offset, $whence);

// 获取当前文件指针的位置(文件流中的偏移量(字节))
var_dump(ftell($fp));

// 将文件指针指向开头,成功true,失败false
rewind($fp);

// 获取文件信息数组
fstat($fp);

// 将文件截取为指定大小(字节)
ftruncate($handle, $size);

// 关闭文件流
fclose($fp);

csv读写

// 将filename指定的名字资源绑定到一个流上。
$fp = fopen($filename, $mode);

// $delimiter是字段间的分界符(只允许一个字符,默认:,)
// $enclosure是每个字段的环绕符(只允许一个字符,默认:")
// $escape是转义字符(只允许一个字符,默认:\)

// 读取csv文件返回包含CSV格式字段的数组,$length必须大于CVS文件内最长的一行字节,
while ($csv = fgetcsv($fp, $length, $delimiter = ',', $enclosure = '"', $escape = '\\'))  {
   // csv中有中文时需要转编码
   iconv('gbk', 'utf-8', $csv[1]);
}

// 写入csv文件,$fields代表一行数据的索引数组
fputcsv($fp, $fields, $delimiter = ',', $enclosure = '"');
// 写入中文时需要转编码
iconv('utf-8', 'gbk', $value);

// 关闭文件流
fclose($fp);

 

{/if}