索引
Linux文
件
注:/dev/zero可用于创建虚拟硬盘时,用0去填充整个磁盘空间; 文件的inode用于记录文件基本信息;
inode数据包含的内容:
注:没有inode数据时,是不能创建文件成功的,所以上图中,最多只能创建14个文件;
ext3文件系统
ext3是很多Linux发行版的默认文件系统;
XFS文件系统
XFS文件系统于2000年5月后移植到了Linux 内核上,XFS 特别擅长处理大文件,同时提供平滑的数据传输。
注:1exbibytes = 1024Pb; 1Pb = 1024Tb; 1Tb = 1024 Gb;
文本文件和二进制文件
注:字符编码如gbk,utf8;
文件的打开方式
注:文件指针操作的最小单位是字节;
注:word文件其实是一个压缩文件,可以将word文件重命名,并将后缀名改为zip,就可以解压出其原始文件;同理,微信电脑版及qq.exe也是压缩文件,都可以直接用压缩软件直接打开;
php文件函数
pack写入二进制文件示例
<?php $fh = fopen('my.db' , 'wb');//php4.3以后打开文件的方式默认为二进制打开,因此,读写方式'wb'里,b是可以省略的 $name = pack('A20' , 'pikaqiu');//将字符串以空格填满,占的空间总长为20 $age = pack('S' , 255);//短整形,占两个字节 $email = pack('a20' , 'pikaqiu@admin.com');//将字符串以NUL填满,占的空间总长为20 fwrite($fh , $name . $age . $email);//文件总长为42个字节 //pack的格式化写法 //$data = pack('A20Sa20' , 'pikaqiu' , '255' , 'pikaqiu@admin.com'); //fwrite($fh , $data);
以16进制打开上面的代码后,结果为:
注:第一行20前面的7个字节对应字符串'pikaqiu',13个20对应变量$name里用于填充的13个空格;FF 00对应$age变量,短整形的255,最后一截对应变量$email的字符串'pikaqiu@admin.com',最后三个00是用于填充的NUL,有NUL值也是二进制文件一个特征,文本文件里不会产生NUL值,00对应的NUL为不可见字符;
unpack解析二进制文件示例
<?php $data = file_get_contents('my.db');//小文件读取可以用file_get_contents函数 $items = unpack('A20name/Sage/a20email' , $data);//二进制文件如果不知道存储格式('A20name/Sage/a20email')的情况下,很难解析其内容 print_r($items) -------------------------------------------------------------------- //打印的结果为: Array ( [name] => pikaqiu [age] => 255 [email] => pikaqiu@admin.com )
png图片判断
注:png文件可以通过前面这个特征来判断,但也不能说有这个特征就绝对是png格式的文件,且此种方法只针对png,其它的图片文件则不适用;其它类型的文件判断,则需要该类型文件的特征码;
php有系统函数可以用来判断图片的格式:exif_imagetype;
文件指针定位
通过文件指针,可以迅速将大文件中某些数据块读取到内存中,如视频播放中的断点定位;
php中XML处理方式比较
php中json的处理
json的格式为:;
csv文件处理
fope详解
php手册中支持的协议和封装,这里标识的协议都可以通过fopen打开;
php大文件上传
php大文件上传XMLHttpRequest示例:
注:这种切片上传的方式,需要配置php.ini里的两个配置:
1)post_max_size=1024M//POST文件的大小
2)max_file_uploads=10000 //能上传的文件数
<html> <head> </head> <body> o<form> o<input type="file" id="file"> o</form> o<div>文件总大小(单位:字节):<span id="fileTotal"></span></div> o<div>已上传的大小(单位:字节):<span id="fileFinish"></span></div> o<div>已上传的大小的百分比:<span id="fileFinishPercentage"></span></div> o<div>未上传的大小(单位:字节):<span id="fileUnfinished"></span></div> <script src="jquery-1.11.2.min.js"></script> <script> o//每次上传文件块的长度,单位:字节 ovar preUploadSize = 1024 * 1024; ovar xhr = new XMLHttpRequest() o//文件块的开始位置 ovar start = 0; o$('#file').change(function(){ ovar files = this.files; o//上传第一个文件 ovar file = files[0]; ovar fileSize = file.size; o$("#fileTotal").html(fileSize); oconsole.dir(file); ovar data = new FormData(); o//上传第一个文件块 obolkSend(0); ovar t = setInterval(function(){ o//设置定时器,每隔1秒去检测一次上一数据块是否上传成功,上传成功时,xhr.responseText里会有上传成功后,php输出的返回值 oif('fail' == xhr.responseText){ o//上传失败 o$("#fileUnfinished").html('上传失败'); oclearInterval(t); o} oif(("" != xhr.responseText && preUploadSize != xhr.responseText) || (start + preUploadSize == fileSize)){ o//最后一个数据块上传成功,清除定时器 o$("#fileFinish").html(fileSize); o$("#fileFinishPercentage").html('100%'); o$("#fileUnfinished").html(0); oclearInterval(t); o} oif(preUploadSize == xhr.responseText){ o//文件块上传成功 ostart += preUploadSize; o$("#fileFinish").html(start); o$("#fileFinishPercentage").html(((start / fileSize).toFixed(2)) * 100 + '%'); o$("#fileUnfinished").html(fileSize - start); o//上传下一次数据块 obolkSend(start); o} o},1000); ofunction bolkSend(start){ odata.append("name" , encodeURIComponent(file.name)); odata.append("file" , file.slice(start , start + preUploadSize)); o oxhr.open("post" , 'upload.php'); oxhr.send(data); o} o}); </script> </body> </html>
<?php set_time_limit(0); $filename = $_POST['name']; $res = file_put_contents('uploads/' . $filename , file_get_contents($_FILES["file"]["tmp_name"]) , FILE_APPEND); if($res) o//有返回的字节数,追加写入成功 oecho $res; else o//文件写入失败 oecho 'fail'