Heim  >  Artikel  >  Backend-Entwicklung  >  PHP Basic Tutorial 15: Datei- und Verzeichnisoperationen

PHP Basic Tutorial 15: Datei- und Verzeichnisoperationen

黄舟
黄舟Original
2017-03-01 10:21:461500Durchsuche


Vorwort


Wenn wir entwickeln, müssen wir manchmal Bilder und Dateien hoch- und herunterladen. Wenn Sie beispielsweise ein Konto registrieren, müssen Sie manchmal ein Bild Ihres Avatars hochladen. Zu diesem Zeitpunkt müssen Sie die Dateiverarbeitung verwenden, und es gibt viele Dateistile wie TXT, Word, Excel usw.

Dateiübertragungsmethode

Die Art und Weise, Dateien in der PHP-Sprache und sogar in anderen Sprachen zu verarbeiten, ist im Wesentlichen eine Stream-Operation. In PHP gibt es zwei Arten von Streams (Byte-Stream, Binär-Stream), die nach unterschiedlichen Ausgabemethoden in Eingabestreams und Ausgabestreams unterteilt sind.
PHP Basic Tutorial 15: Datei- und Verzeichnisoperationen
Dateiströme werden alle vom Speicher referenziert. Wenn die Daten vom Speicher in eine Datei auf der Festplatte gespeichert werden, nennen wir sie einen Ausgabestream Nennen Sie es einen Ausgabe-Eingabestream.

Dateioperationsmethoden

Es gibt zwei Möglichkeiten, Dateien in PHP zu bedienen

  • Lokale Operation

  • Remote-Betrieb

Der lokale Betrieb dient dem Hinzufügen, Löschen, Ändern und Überprüfen von Dateien auf Ihrem eigenen Computer.

Remote-Betrieb bedeutet, aus der Ferne auf den Server zuzugreifen und Vorgänge wie das Hinzufügen, Löschen, Ändern und Überprüfen von Dateien auf dem Server auszuführen.

Die Funktionen zum Bedienen von Dateien können Sie dem Hilfedokument entnehmen:

PHP Basic Tutorial 15: Datei- und Verzeichnisoperationen

Hier sind nur einige der aufgeführten Funktionen aufgeführt. Weitere Funktionen finden Sie im Hilfedokument. Sie können sehen, dass es im Hilfedokument insgesamt 81 Funktionen gibt, wir müssen jedoch nicht alle beherrschen, sondern nur die häufig verwendeten.

Dateien bearbeiten

relevante Informationen von Dateien lesen

Wenn wir Dateien bearbeiten, müssen wir manchmal die relevanten Informationen der Datei kennen, wie z. B. die Größe der Datei, Typ, Dateierstellungszeit, Änderungszeit, Zugriffszeit und andere Informationen. Hier wird die Technologie zum Lesen dateibezogener Informationen verwendet, die in PHP in zwei Formen unterteilt ist, um Dateiinformationen zu erhalten.

Die erste Möglichkeit, dateibezogene Informationen zu lesen

<?php

    //写一个变量记录文件的路径
    $file_path = "D:/config.txt";

    if(file_exists($file_path)){
        //文件存在
        if($fp = fopen($file_path,&#39;r&#39;)){
            //$type是一个存放文件信息的数组
            $type = fstat($fp);
            echo &#39;<br>文件的字节是:&#39; . $type[&#39;size&#39;];
            echo &#39;<br>文件创建时间是:&#39; . date(&#39;Y-m-d H:i:s&#39;,$type[&#39;ctime&#39;]);
            echo &#39;<br>文件访问时间是:&#39; . date(&#39;Y-m-d H:i:s&#39;,$type[&#39;atime&#39;]);
            echo &#39;<br>文件修改时间是:&#39; .date(&#39;Y-m-d H:i:s&#39;,$type[&#39;mtime&#39;]);
            //关闭资源
            fclose($fp);
        }else{
            echo &#39;文件打开失败&#39;;
        }
    }else{
        echo &#39;文件不存在&#39;;
    }
    ......结果.......
    文件的字节是:22
    文件创建时间是:2016-10-12 20:34:56
    文件访问时间是:2016-10-12 20:34:56
    文件修改时间是:2016-10-12 20:35:08

1 Wir definieren zunächst einen Pfad zu der Datei, auf die wir zugreifen.
2. Bestimmen Sie, ob die Datei vorhanden ist, indem Sie die Funktion file_exists($path) verwenden. Sie gibt true zurück, wenn sie nicht existiert.
3 öffnet eine Datei und gibt einen Dateizeiger zurück, der auf die erste Zeile zeigt. Der erste Parameter ist der Pfad der Datei, der zweite Parameter ist die Zugriffsform der Datei, „r“ bedeutet Lesen der Datei.
4. fstat (Dateizeiger) ruft Dateiinformationen über den geöffneten Dateizeiger ab und gibt ein Array zurück, das einige assoziative Arrays mit den gewünschten Werten enthält.
5. Denken Sie daran, die Ressource nach der Verwendung zu schließen, da sonst manchmal unerwartete Fehler auftreten können.

Die zweite Möglichkeit, Dateiinformationen zu lesen

<?php

    $file_path = &#39;D:/config.txt&#39;;
    echo &#39;<br>文件的类型是:&#39; . filetype($file_path);
    echo &#39;<br>文件的大小是:&#39; . filesize($file_path);
    echo &#39;<br>文件的创建时间是:&#39; . date(&#39;Y-m-d H:i:s&#39;,filectime($file_path));
    echo &#39;<br>文件的访问时间是:&#39; .date(&#39;Y-m-d H:i:s&#39;,fileatime($file_path));
    echo &#39;<br>文件的修改时间是:&#39; . date(&#39;Y-m-d H:i:s&#39;,filemtime($file_path));
    .....结果.....
    文件的类型是:file
    文件的大小是:22
    文件的创建时间是:2016-10-12 20:34:56
    文件的访问时间是:2016-10-12 20:34:56
    文件的修改时间是:2016-10-12 20:35:08

Diese Methode ist relativ einfach. Sie ruft dateibezogene Informationen direkt über Funktionen ab, sollte jedoch am Ende jeder Funktion geöffnet werden. Datei zum Betrieb.

Lesen Sie den Inhalt der Datei

Beim Betrieb von Dateien müssen wir häufig den Inhalt der Datei lesen. PHP bietet drei Möglichkeiten zum Lesen von Dateien.

Die erste Möglichkeit, Dateien zu lesen

<?php
    header("Content-type:text/html;charset = utf-8");
    $file_path = &#39;D:/config.txt&#39;;

    if(file_exists($file_path)){

        if($fp = fopen($file_path,&#39;r&#39;)){
            //获取文件的大小
            $file_size = fstat($fp)[&#39;size&#39;];
            $content = fread($fp, $file_size);
            //对文件中中文进行编码
            $content = iconv(&#39;gbk&#39;, &#39;utf-8&#39;, $content);
            //对换行符进行替换。
            $content = str_replace("\r\n", "<br>", $content);
            echo $content;
            fclose($fp);
        }else{
            echo &#39;文件打开失败&#39;;
        }
    }else{
        echo &#39;文件不存在&#39;;
    }
    ......结果.......
    这是一些配置文件信息。
    user = abc;
    password = 122;
  • Definieren Sie den vollständigen Pfad der Datei

  • file_exists($path ) Bestimmen Sie, ob die Datei vorhanden ist

  • fopen($path, access form) Es gibt viele Zugriffsformulare in dieser Funktion, und wir verwenden nur drei häufig verwendete:

  1. r, lese die Datei, der Dateizeiger zeigt auf den Kopf

  2. w, schreibe die Datei, wenn die Datei existiert, zeigt der Dateizeiger auf den Kopf und löschen Sie den Inhalt darin. Wenn die Datei nicht vorhanden ist, wird die Datei erstellt.

  3. a führt einen Schreibvorgang für eine Datei aus. Wenn die Datei vorhanden ist, zeigt der Dateizeiger auf das Ende und der Inhalt wird nicht gelöscht, wenn die Datei nicht vorhanden ist , die Datei wird erstellt.

  • fread (Dateizeiger, Größe) Mit dieser Funktion werden Dateioperationen ausgeführt. Durch Ermitteln der Dateigröße wird eine Datei als Ganzes geschrieben $Inhalt.

  • iconv (Eingabezeichensatz, Ausgabezeichensatz, Zeichenfolge) Diese Funktion codiert die Funktion in der Datei und speichert sie in der Datei in GBK und auf der Seite. Es ist utf-8 ,

  • str_replace (zu ersetzendes Zeichen, Ringzeichen, Zeichenfolge). Diese Funktion dient zum Konvertieren des Newline-Zeichens in der Datei unter Windows ". Der Inhalt der Datei wird auf der Webseite angezeigt. Das Zeilenumbruchzeichen der Webseite ist „
    “. Beachten Sie, dass das Escape-Zeichen in doppelte Anführungszeichen gesetzt werden muss.

  • Schließen Sie die Dateizeigerressource

  • Die zweite Möglichkeit, die Datei zu lesen

    Lesen Sie als erstes das Abrufen der Datei bedeutet, dass die gesamte Datei auf einmal gelesen wird. Wenn die Datei sehr groß ist, ist diese Methode nicht sinnvoll. Sie können die Schleife verwenden, indem Sie zuerst einen Teil lesen, ihn zusammenführen und dann einen Teil lesen und ihn zusammenführen.

    <?php
    
        $file_path = &#39;D:/config.txt&#39;;
    
        if(file_exists($file_path)){
            if($fp = fopen($file_path,&#39;r&#39;)){
                //文件太大,分字节度
                $size = 1024;//每次读取1024个字节
                $tmp_content = &#39;&#39;;//存放一次读取的内容
                $content = &#39;&#39;;//存放总的内容。
                while(!feof($fp)){
                    $tmp_content = fread($fp,$size);
                    $content .= $tmp_content;
                }
    
                $content = iconv(&#39;gbk&#39;, &#39;utf-8&#39;, $content);
                $content = str_replace("\r\n", "<br>", $content);
                echo $content;
                fclose($fp);
    
            }else{
                echo &#39;文件打开失败&#39;;
            }
    
        }else{
            echo &#39;文件不存在&#39;;
        }
        ......结果.......
        这是一些配置文件信息。
        user = abc;
        password = 122;

    - 从上面的代码中可以看出来,读取文件的内容是分块读取的,读取一次,拼接到总的内容上。
    - feof(文件指针) 测试文件指针是否到了文件结束的位置,当文件指针指向最后则不用循环。
    - 关闭文件指针资源

    读取文件的第三种方式

    <?php
        $file_path = &#39;D:/config.txt&#39;;
        $content =  file_get_contents($file_path);
        $content = iconv(&#39;gbk&#39;,&#39;utf-8&#39;,$content);
        $content = str_replace("\r\n","<br>",$content);
        echo $content;
        ......结果.......
        这是一些配置文件信息。
        user = abc;
        password = 122;

    第三种方式是最简单的一种方式,通过file_get_contents()方法进行整体的读取。

    创建文件和写文件

    创建文件和写文件第一种方式

    <?php
        //定义文件的路径
        $file_path = &#39;D:/test.txt&#39;;
    
        if(!file_exists($file_path)){
            //文件不存在
            //fopen()函数使用w这种访问形式,
            if($fp = fopen($file_path, &#39;w&#39;)){
                $str = &#39;&#39;;
                for($i = 0; $i < 10; $i++){
                    $str .= "hello,php\r\n";
                }
                //向文件中写数据
                fwrite($fp, $str);
                fclose($fp);
            }
        }

    - 当文件不存在的使用使用fopen()打开文件是自动创建文件的,这里使用的文件访问形式是w,文件指针指向头部,清空文件里面的内容。
    - 通过fread()函数想文件中写文件。
    - 当文件存在的时候我们可以使用’a’这种访问形式进行对文件内容的追加写入。

    创建文件和写文件第二种方式

    <?php
        //定义文件的路径
        $file_path = &#39;D:/test.txt&#39;;
    
        if(!file_exists($file_path)){
            $str = &#39;&#39;;
            for($i = 0; $i < 10; $i++){
                $str .= "hello,php\r\n";
            }
    
            file_put_contents($file_path, $str);
    
        }

    - 使用file_put_contents()函数进行文件的写入,这个函数也是当文件不存在的时候,创建文件。
    - 如果我们通过file_put_contents函数来追加新的内容到文件中,应该在使用file_put_contents函数时,带上第三个参数 FILE_APPEND 即可。

    删除文件

    <?php
        $file_path = &#39;D:/test.txt&#39;;
    
        if(file_exists($file_path)){
            if(unlink($file_path)){
                echo &#39;文件删除成功&#39;;
            }else{
                echo &#39;文件删除失败&#39;;
            }
        }

    - 通过unlink(文件路径)函数删除文件。

    修改文件的名字

    <?php
        $file_path = &#39;D:/test.txt&#39;;
        $file_newPath = &#39;D:/newtest.txt&#39;;
    
        if(file_exists($file_path)){
            if(rename($file_path,$file_newPath)){
                echo &#39;文件名修改成功&#39;;
            }else{
                echo &#39;文件名修改失败&#39;;
            }
        }

    - 修改文件的名字可以通过rename(

    新的文件名)进行修改,当修改成功时返回true,失败返回false。这个函数还可以移动文件的位置。


    对目录的操作

    在php文件编程中,目录也是一种文件,是一种比较特殊的文件,因此对目录的操作有固定的操作方法,主要的方法有三个 is_dir,rmdir,mkdir

    • is_dir 判断是否是一个目录

    • rmdir 删除一个目录,当目录下面有文件或目录的时候不能删除。

    • mkdir 创建一个目录

      <?php
      
          $dir_path = &#39;D:/test&#39;;
          //判断目录是否存在
          if(is_dir($dir_path)){
              echo &#39;目录存在&#39;;
          }else{
              //目录不存在,创建目录
              if(mkdir($dir_path)){
                  echo &#39;目录创建成功&#39;;
              }else{
                  echo &#39;目录创建失败&#39;;
              }
          }
    • 上面先判断目录是否存在,不存在使用mkdir()函数进行目录的创建。

    上面的代码只能创建一级目录,当路径名字换成$dir_path = ‘D:/test/a/b/c/d’时,在test目录下还有目录,这时候用上面的方法就会报错,不能够创建多级目录。这时候也可以使用mkdir()函数进行创建,但是在函数中多了两个参数,这两个参数对于windows系统下开发是没有意义的。

    <?php
    
        $dir_path = &#39;D:/test/a/b/c/d&#39;;
        //判断目录是否存在
        if(is_dir($dir_path)){
            echo &#39;目录存在&#39;;
        }else{
            //目录不存在,创建目录
            if(mkdir($dir_path,0777,true)){
                echo &#39;目录创建成功&#39;;
            }else{
                echo &#39;目录创建失败&#39;;
            }
        }
    • 可以看到在创建目录的函数中添加了两个参数,就能创建多级目录。0777是在linux下的最大访问权限,而true是表示创建多级目录。

    删除目录

    <?php
        $dir_path = &#39;D:/test&#39;;
    
        if(is_dir($dir_path)){
            //目录存在
            if(rmdir($dir_path)){
                echo &#39;目录删除成功&#39;;
            }else{
                echo &#39;目录删除失败&#39;;
            }
        }

    - 通过rmdir(目录路径)删除目录。
    - 删除目录时,下面没有目录或者文件的存在。
    - rmdir()函数只能删除一个目录,不能删除多个目录,删除多个目录,可以使用递归删除。

        <?php
    
            //在这里test目录下的全目录是:D:/test/a/b/c/d
            $dir_path = &#39;D:/test&#39;;
            delDir($dir_path);
            function delDir($dir_path){
                //打开当前的目录
                $dir = opendir($dir_path);
                //通过readdir函数获取目录下的所有目录
                while(false !== ($fileName = readdir($dir))){
                    //对当前的目录进行拼接
                    if($fileName != &#39;.&#39; && $fileName != &#39;..&#39;){
                        $dir_name = $dir_path . &#39;/&#39; . $fileName;
                        if(is_dir($dir_name)){
                            //是一个目录,通过递归在此判断。
                            delDir($dir_name);
                            //递归完成,当前目录下为空,删除目录。
                        }else if(is_file($dir_name)){
                            //是文件删除文件。
                            unlink($dir_name);
                        }
                    }
    
                }
                closedir($dir);
                rmdir($dir_path);
            }

    把文件删除的操作封装到函数中,如果目录下没有文件则while循环不会进入循环,而是直接删除目录。当有目录或文件时,可以在循环中递归的执行函数,知道遇到是文件或目录为空(基准条件)。

    文件的拷贝

    <?php
        //当前需要复制的文件路径。
        $file_path = &#39;D:/Desert.jpg&#39;;
        //需要复制到哪的路径
        $path = "E:/desert.jpg";
        if(file_exists($file_path)){
            if(copy($file_path,$path)){
                echo &#39;复制成功&#39;;
            }else{
                echo &#39;复制失败&#39;;
            }
    
        }else{
            echo &#39;文件不存在&#39;;
        }
    • 定义的文件的全路径

    • 定义目标的路径。

    • 利用copy函数直接进行复制拷贝,第一个参数是文件的路径,第二个参数是目标的路径。

    遍历目录

    <?php
    
        $dir_path = &#39;D:/test&#39;;
        isDir($dir_path);
        function isDir($dir_path){
            if(is_dir($dir_path)){
                //存在文件
                $dir = opendir($dir_path);
                //打开目录
                while(($fileName = readdir($dir)) !== false){
                    if($fileName != &#39;.&#39; && $fileName != &#39;..&#39;){
                        if(is_dir($dir_path . &#39;/&#39; . $fileName)){
                            echo &#39;<br>目录名是:&#39; . $fileName;
                            isDir($dir_path . &#39;/&#39; . $fileName);
                        }else if(is_file($dir_path . &#39;/&#39; . $fileName)){
                            echo &#39;<br>文件名是:&#39; . $fileName;
                        }
                    }
    
                }
                //关闭资源
                closedir($dir);
            }
        }
        ......结果.......
        目录名是:a
        文件名是:a.txt
        目录名是:b
        目录名是:c
        目录名是:d
        文件名是:n.doc
        文件名是:c.txt

    * 通过递归进行循环的判断一个目录下面的所有目录和文件,进行输出。
    * 在每个目录下都隐藏着两个无用的目录,所以通过if判断把这两个无用的目录过滤掉。

    统计目录的大小。

    <?php
    
        $dir_path = &#39;D:/test&#39;;
        echo getSize($dir_path);
    
        function getSize($dir_path){
            //定义字节。
            $size = 0;
            //判断是否目录
            if(is_dir($dir_path)){
                //打开目录
                $dir = opendir($dir_path);
    
                //判断每个目录是否存在。
                while(false !== ($fileName = readdir($dir))){
                    //过滤无用的两个目录。
                    if($fileName != &#39;.&#39; && $fileName != &#39;..&#39;){
    
                        if(is_dir($dir_path . &#39;/&#39; . $fileName)){
                            //通过递归进行循环的获取字节大小。
                            $size += getSize($dir_path . &#39;/&#39; . $fileName); 
    
                        }else if(is_file($dir_path . &#39;/&#39; . $fileName)){
    
                            $size +=filesize($dir_path . &#39;/&#39; . $fileName);
                        }
                    }
                }
            }
            //关闭资源。
            fclose($dir);
            return $size;
        }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
        .......结果.......
        47

    PHP Basic Tutorial 15: Datei- und Verzeichnisoperationen

    • 获取目录的字节通过递归完成。定义$size记录每个文件的大小,返回。

    总结

    PHP中对于文件的操作还是很重要的,对于文件的操作要灵活的应用不同的函数。

     以上就是PHP基础教程十五之文件、目录的操作的内容,更多相关内容请关注PHP中文网(www.php.cn)!


    Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn