美文网首页
文件处理系统

文件处理系统

作者: 全栈coder | 来源:发表于2017-02-25 23:05 被阅读29次
    • php是以UNIX文件系统为模型的,因此在windows系统中我们只能获得“file”,“dir”或者“unknown”三种文件类型。而在UNIX系统中,我们可以获得“block”,“char”,“dir”,“fifo”,“file”,“link”七种类型
    filetype()         --此函数可以判断文件类型
    

    常用的文件属性处理函数

    file_exists()      --检查目录或文件是否存在
    filesize()         --取得文件大小,返回的是字节数
    is_readable()      --判断给定的文件是否可读
    is_writable()      --判断给定的文件是否可写
    is_executable()    --判断给定的文件是否可执行
    filectime()        --获取文件的创建时间
    filemtime()        --获取文件的修改时间
    fileatime()        --获取文件的访问时间
    stat()             --获取文件的大部分属性,返回数组
    

    1.目录的基本操作

    在windows中默认使用“\”作为路径分隔符
    在UNIX系统中使用“/”作为路径分隔符
    当然windows也接受使用“/”作为分隔符,所以为了程序的可移植性,建议都使用“/”作为分隔符,另外PHP的内置常量DIRECTORY_SEPARTOR,其值为当前系统的默认文件路径分隔符。

    basename()    --返回路径中的文件名部分
    dirname()     --返回路径中的目录部分,和楼上相反
    pathinfo()    --返回一个关联数组其中包括指定路径中的目录名、基本名和扩展名三个部分
    
    建立和删除目录
    mkdir()    --建立一个新目录
    rmdir()    --只能删除一个空目录
    unlink()   --删除一个文件
    

    可以自定义一个函数使用递归方法删除一个非空目录

    function  delDir($directory){
        if (file_exists($directory)) {
           if ($dir_handle = @opendir($directory)) {
             while ($filename = readdir($dir_handle)) {
               if ($filename != "." && $filename != "..") {
                 $subFile = $directory.'/'.$filename;
                 if (is_dir($subFile))
                    delDir($subFile);
                 if (is_file($subFile))
                    unlink($subFile);
               }
             }
             closedir($dir_handle);
             rmdir($directory);
           }
        }
    }
    
    统计目录大小

    自定义函数使用递归方法

    function dirSize($directory) {
      $dir_size = 0;
      if ($dir_handle = @opendir($directory)) {
        while ($filename = readdir($dir_handle)) {
          if ($filename != '.' && $filename != '..') {
            $subFile = $directory.'/'.$filename;
            if (is_dir($subFile))
              $dir_size +=   dirSize($subFile);
            if (is_file($subFile))
              $dir_size +=  filesize($subFile);
          }
        }
        closedir($dir_handle);
        return $dir_size;
      }
    }
    

    2.文件的基本操作

    基本的操作函数
    fclose()      --关闭已打开的文件资源
    fopen()       --打开一个文件,第一个参数需要被打开文件的URL,  第二个参数需要提供文件模式
    copy(来源文件,目的文件)          --复制文件
    unlink(目标文件)                 --删除文件
    ftruncate(目标文件资源,截取长度)      --将文件截取到指定的长度
    rename(旧文件名,新文件名)             --重命名文件名或者目录   
    
    

    文件模式如下:

    模式字符 描述
    r 只读,从文件开头
    r+ 读写,从文件开头
    w 只写,从文件开头,如果文件存在,清空文件内容
    w+ 读写,从文件开头,如果文件存在,清空文件内容
    x 创建并以写入方式打开,从文件开头。如果文件存在返回false,仅用于本地文件
    x+ 创建并以读写方式打开,从文件开头。如果文件存在返回false,仅用于本地文件
    a 只写,从文件末尾追加
    a+ 读写,从文件末尾追加
    b 二进制模式打开,用于与其他模式进行连接
    t 文本模式打开文件
    文件写入
    fwrite(resource handle,string string[,int length])     --执行后返回写入的字符数
    
    file_put_contents()        --直接将数据写入指定的文件中,不过会清空之前的内容
    
    读取文件内容
    fread()               --读取打开的文件,第二个参数可设置读取多少字节
    file_get_contents     --将文件读入到字符串
    fgets()               --从打开的文件中返回一行
    fgetc()               --从打开的文件中返回字符串
    readfile()            --读取一个文件,并输出到输出缓冲
    
    移动文件指针
    ftell()        --返回文件指针到当前位置
    fseek()        --移动文件指针到指定位置
    rewind()      --移动文件指针到文件的开头
    使用这些函数时,必须提供一个用fopen打开的,合法的文件指针。
    函数ftell()获取文件当前位置的指针偏移量;
    函数rewind()将文件指针移回到文件的开头;
    而函数fseek()则将指针移动到第二个参数offset指定的位置,如果没有提供第三个参数whence,
    则位置将设定为从文件开头的offset字节处。否则,第三个参数whence可以设置为三个可能的值,
    它将影响指针的位置。
    
    文件的锁定机制

    在PHP中提供了flock() 函数,可以对文件使用锁定机制。当一个进程在访问文件时加上锁,其他进程想要对该文件进行访问,则必须等到锁定被释放之后,这样就可以避免在并发访问同一个文件时破坏数据。

    bool flock( int handle, int operation [,int &wouldblock] )      --轻便的咨询文件锁定
    第一个函数必须是一个已经打开的文件资源,
    第二个参数operation也是必须的,规定使用哪种锁定类型。operation可以是以下值之一:
       >LOCK_SH取得共享锁定(从文件中读取数据时使用)
       >LOCK_EX取得独占锁定(从文件中写入数据时使用)
       >LOCK_UN释放锁定(无论共享或独占锁,都用它释放)
       >LOCK_NB附加锁定(如果不希望flock()在锁定时堵塞,则应在上述锁定后加上该锁)
    如果锁定会堵塞的话(已经被flock()锁定的文件,再次锁定时,flock()函数会被挂起,
    这时称为锁定堵塞),也可以将选定的第三个参数设置为1,则当进行锁定时会阻挡其他进程。
    

    文件的上传和下载

    文件上传
    • 客户端上传设置
      文件上传的最基本方式是使用html表单选择本地文件进行提交,在form表单中可以通过<input type="file">标记选择本地文件。如果文件支持上传操作,必须在<form>标签中将enctype和method两个属性指明相应的值,如下所示:
    <html>
      <head>
        <meta charset="utf-8">
        <title>文件上传</title>
      </head>
      <body>
        <form class="" action="upload.php" method="post" enctype="multipart/form-data">
            <input type="hidden" name="MAX_FILE_SIZE" value="10000000">
            选择文件:<input type="file" name="myfile">
            <input type="submit" name="" value="上传文件">
        </form>
      </body>
    </html>
    
    • 在服务器端通过PHP处理上传
      上传文件接收和后续处理就要通过php来处理。想要通过php成功的管理文件上传。需要通过以下三方面信息。如下所示:

      》 设置PHP配置文件中的指令: 用于精细的调节PHP的文件上传功能。
      》$_FILES多维数组: 用于储存各种与上传文件相关的信息,其他数据还使用$_POST去接收。
      》PHP的文件上传处理函数:用于上传文件的后续处理。

    PHP配置文件中与文件上传有关的选项

    指令名 默认值 功能描述
    file_uploads ON 确定PHP脚本是否接收HTTP文件上传
    upload_max_filesize 2M 限制PHP处理上传文件大小的最大值,此值必须小于post_max_size值
    post_max_size 8M 限制通过POST方法可以接受信息的最大值,此值应当大于配置指令upload_max_file的值,因为除了上传的文件之外,还可能传递其他的表单域
    upload_tmp_dir NULL 上传文件存放的临时路径,可以是一个绝对路径。

    全局数组$_FILES中的元素说明

    数组 描述
    $FILES["myfile"]["name"] 客户端机器文件的原名称,包含扩展名
    $FILES["myfile"]["size"] 已上传文件的大小,单位是字节
    $FILES["myfile"]["tmp_name"] 文件被上传后,在临时目录中的文件名
    $FILES["myfile"]["error"] ● 0 - 表示没有任何错误,文件上传成功;
    ● 1 -表示 大小超过了配置文件中upload_max_filesize选项限制的值;

    ● 2 -表示上传文件大小超过了HTML表单设置的最大值;
    ● 3 -文件只有部分被上传;
    ● 4 -没有上传任何文件
    $FILES["myfile"]["error"] 获取上传文件的类型,比如是图片,视频,等等

    上表中$_FILES数组的第一维“myfile”,代表的是上传表单元素(<input type="file" name="myfile">)中的name属性的值,另外php还有两个专门用于文件上传所使用的函数

    is_uploaded_file(string filename)   //判断指定的文件是否是通过HTTP POST上传的,函数的参数必须是指定类似于$FILES["myfile"]["tmp_name"] 的变量,才能判断指定的文件缺失是上传文件
    move_uploaded_file()      //将上传的文件移动到新位置,虽然函数copy()和函数move() 同样好用,但是move_uploaded_file()  提供了一种额外的功能,就是判断第一个参数filename指定的文件,是否是合法的上传文件。如果不是则不会移动文件并且返回false
    
    文件下载

    简单的下载就像这样:

    <a href="http://www.souhu.com/download/book.rar">下载文件</a>
    

    一行代码直接搞定,
    当然,为了提高安全性,当然要逼格高一点类似下面这样

    header('Content-Type:image/gif;);
    header('Content-Disposition:attachment;filename="test.gif"');
    header('Content-Length:3390');
    

    相关文章

      网友评论

          本文标题:文件处理系统

          本文链接:https://www.haomeiwen.com/subject/yetnwttx.html