想一想:什么是文件?
Linux文件
- 定义:存储在某种设备中的一段数据流
- 在Linux中,几乎一切都是文件
- 文件类型:普通文件、链接文件、目录文件、设备文件
- 设备文件:/dev/tty, /dev/null, /dev/zero
- 每个文件对应一个“inode”数据
inode包含什么内容?
- 文件的字节数
- 文件的uid和gid
- 文件的读、写、执行权限
- 文件的时间戳:ctime,mtime,atime
- 链接数:有多少文件名指向这个inode
- 文件数据block的位置
ext3文件系统特点
- ext3是一种日志式文件系统
- 最长文件名:255字节
- 最大文件大小:16GB-64T(取决于块尺寸)
- 最大卷容量:2TB-32TB
- 最大文件数量:可变
XFS文件系统特点
- XFS是一种日志式文件系统,最早1993年
- 最长文件名:255字节
- 最大文件大小:8 exbibytes减1字节
- 最大卷容量:16 exabytes
- 最大文件数量:可变
- 已经在CenOS7上作为默认文件系统
文本文件和二进制文件有什么不同?
- 文本文件是基于字符编码的文件
- 除了文本文件以外的文件称为二进制文件
- 二进制文件编码是变长的,灵活利用率高
- 两者读写差别仅体现在回车换行符的处理上
- 文本文件是一种特殊的“二进制文件”
文件的打开方式有哪些?
$handle = fopen('test.txt', 'r');
- r 只读方式打开,将文件指针指向文件头
- r+ 读写方式打开,将文件指针指向文件头
- w 写入方式打开,将文件指针指向文件头(源文件会被清空)
- w+ 读写方式打开,将文件指针指向文件头(同上)
- a 写入方式打开,将文件指针指向文件末尾
- a+ 读写方式打开,将文件指针指向文件末尾
- x 创建并以写入方式打开,将文件指针指向文件头(原有文件不能存在)
- x+ 创建并以读写方式打开,其他的行为和x一样(同上)
- c 写入方式打开,将文件指针指向文件头(原有文件会被覆盖)
- c+ 读写方式打开,将文件指针指向文件头(同上)
文件的打开方式的特殊标记
1.标记('t')可以将\n转换为\r\n(windows)
$handle = fopen("test.txt", "wt");
2.标记('b')来强制使用二进制模式
$handle = fopen("test.txt", "rb");
把多个文件合并为一个文件
$fh = fopen('dest.txt', '?');
$fh1 = fopen('file1.txt', '?');
$fh2 = fopen('file2.txt', '?');
练习:用pack创建二进制文件
1.用pack创建二进制文件“my.db”,文件里面存入的内容为:姓名、QQ号、email。
$fh = fopen('./my.db', 'w');
$name = pack('A20', 'zsf'); //A20的意思是将字符串以空格填满
$age = pack('S', 255);
$email = pack('a20', 'zhangsf@qq.com'); //a20的意思是将字符串以null填充
fwrite($fh, $name . $age . $email);
或者
$data = pack('A20Sa20', 'zwf', 1219, 'wf@qq.com');
fwrite($fh, $data);
2.用unpack把以上文件内容读取出来。
$data = file_get_contents('my.db');
$items = unpack('A20name/Sage/a20email', $data);
print_r($items);
怎么判断是不是PNG图片?
- <FrontBlock>
- <Pattern>
- <Bytes>89504E470D0A1A0A0000000D49484452</Bytes>
- <ASCII>.PNG........IHDR</ASCII>
- <Pos>0</Pos>
- </Pattern>
- </FrontBlock>
文件指针的定位操作
- fseek() 在文件指针中定位
- ftell() 返回文件指针读/写的位置
- rewind() 倒回文件指针的位置
- feof 测试文件指针是否到了文件结束的位置
随机读写文件的应用
- 分析读取特定的二进制文件的内容,如纯真IP库、QQ本地消息、图片元数据信息等
- 创建特定的二进制文件,如pdf,word,chm等
- 对大文件进行切割,如视频切割器
- 创建自定义的二进制文件,实现自己的独特需求,如设计自己的数据库文件
PHP中XML处理方式比较
- DOM:一次性将xml载入内存,内存问题需要注意
- SimpleXML:小文件可以选择它,不支持命名空间。
- <?php
- $string = <<<XML
- <?xml version='1.0'?>
- <document>
- <cmd>login</cmd>
- <login>imdonkey</login>
- </document>
- XML;
-
- pring_r($xml);
- XMLReader:边读边操作,“拉取”模型
- <?xml version="1.0" encoding="utf-8"?>
- <collection>
- <cd>
- <title type="hk">港台明星</title>
- <artist>刘德华</artist>
- <tear>1995</year>
- </cd>
- <cd>
- <title>大陆演员</title>
- <artist>范冰冰</artist>
- <tear>1997</year>
- </cd>
- </collection>
- $reader->open('collection.xml', 'utf-8');
- while($reader->read()){
- if($reader->name=="cd" && $reader->nodeType==XMLReader::ELEMENT){
- $item=[];
- while($reader->nodeType!=XMLReader::ELEMENT)continue;
- $name=$reader->name;
- $value=$reader->readString();
- // echo $key=$reader->getAttribute('name');
- $item[$name]=$value;
- }
- $items[]=$item;
- }
- $reader->close();
- XML Parser:SAX模型是一个“推送”模型
- <?php
- $file = "collection.xml";
- $depth = [];
-
- function startElement($parser, $name, $attrs)
- {
- global $depth
- }
- function endElement($parser, $name)
- {
- global $depth;
- }
- function data($parser, $data)
- {
- }
-
-
-
-
- xml_get+current_line_number(xml_parser)));
- }
- }
PHP中JSON的处理
一下符合JSON标准的有?
A:{a:'abc'}
B: {'a':'abc'}
C: {"a":"abc",}
D:{"a":"abc"}
- jsson_encode 目前只能处理UTF-8编码的数据
- JSON_UNESCAPED_UNICODE 让JSON更懂中文
- 解析出错,看json_last_error()返回的错误
- JSON格式是灵活开放的,特殊情况可以用sprintf来自己组装或者解析JSON字符串
$format = '["%s",%d,%b]';
echo $jsonstr = sprintf($format, '张三丰', 16, false);
$json = json_decode($jsonstr);
print_r($json);
echo json_last_error_msg();
- <?php
- function encode($data){
- case 'NULL':
- return 'null';
- case 'boolean':
- return ($data ? 'true' : 'false');
- case 'integer':
- case 'double':
- case 'float':
- return $data;
- case 'string':
- case 'object':
- case 'array':
- $count = 0;
- $indexed = [];
- $associative = [];
- foreach ($data as $key => $value){
- $count = NULL;
- }
- $one = encode($value);
- $indexed[] = $one;
- $associative[] = encode($key) . ':' . $one;
- }
- if ($count !== NULL) {
- } else {
- return '{' . implose(',', $associative) . '}';
- }
- default:
- return '';
- }
- }
json_encode的参数
- JSON_HEX_TAG 所有的 < 和 > 转换成 \u003c 和 \u003e
- JSON_HEX_AMG 所有的 & 转换成 \u0026
- JSON_HEX_APOS 所有的 ' 转换成 \u0027
- JSON_HEX_QUOT 所有的 " 转换成 \u0022
- JSON_FORCE_OBJECT 强制使用索引数组输出
- JSON_NUMERIC_CHECK 将所有数字字符串编码成数字
- JSON_BIGINT_AS_STRING 将大数字编码成原始字符原来的值
- JSON_PRETTY_PRINT 用空白字符格式化返回的数据
- JSON_UNESCAPED_SLASHES 不要编码 /
- JSON_UNESCAPED_UNICODE 以字面编码多字节Unicode字符(默认是编码成 \uXXXX)
CSV文件处理
fputcsv()
fgetcsv()
fopen 还能打开什么?
fopen('php://stdout', 'w');
- file:// 访问本地文件系统
- http:// 访问HTTP(S) 网址
- ftp:// 访问FTP(S) URLs
- php:// 访问各个输入/输出流(I/O streams)
- zlib:// 压缩流
- http://php.net/manual/zh/wrappers.php
<?php
fputs(STDOUT, strtoupper(fgets(STDIN)));
//echo stroupper(fgets(STDIN));
//fputs(STDOUT, 'hello');
//$fp1 = fopen('php://stdin', 'r');
//echo strtoupper(fgets($fp1));
//$fp2 = fopen('php://stdout', 'w');
//fputs($fp2, 'hello');
如何实现超大文件上传?
- 客户端控件:需要本地安装指定控件
- 采用 swfUpload、uploadify 等Flash组件
- 用XMLHttpRequest 实现大文件上传和断点续传
XMLHttpRequest 2.0 的新特性
- 可以上传文件
- 可以设置HTTP请求的时限
- 可以使用FormData对象管理表单数据
- 可以请求不同域名下的数据(跨域请求)
- 可以获取服务器端的二进制数据
- 可以获取数据传输的进度信息