在PHP中,附加文件打开模式(带有附加' +'符号的模式)的重要性和用法是什么?

时间:2015-05-17 13:51:15

标签: php file file-io file-handling

我是PHP的新手。

我正在学习PHP的基本核心概念。 '文件处理' 是PHP的基本和重要概念之一。

在研究这个概念时,我遇到了PHP中提供的各种文件打开模式。以下是每种文件打开模式的描述:

Modes   Description
  r        Open a file for read only. File pointer starts at the beginning of the file
  w        Open a file for write only. Erases the contents of the file or creates a new file if it doesn't exist. File pointer starts at the beginning of the file
  a        Open a file for write only. The existing data in file is preserved. File pointer starts at the end of the file. Creates a new file if the file doesn't exist
  x        Creates a new file for write only. Returns FALSE and an error if file already exists
  r+       Open a file for read/write. File pointer starts at the beginning of the file
  w+       Open a file for read/write. Erases the contents of the file or creates a new file if it doesn't exist. File pointer starts at the beginning of the file
  a+       Open a file for read/write. The existing data in file is preserved. File pointer starts at the end of the file. Creates a new file if the file doesn't exist
  x+       Creates a new file for read/write. Returns FALSE and an error if file already exists

我能够从上面的列表中了解前四种文件打开模式的目的(即' r',' w',' a'和&# 39; x')但我完全无法从上面的列表中理解其他文件打开模式的目的(即' r +',' w +&# 39;,' a +'和' x +')因为它与前四种文件打开模式的描述相同。

所以我的问题是,由于前四种基本文件打开模式已经可用,那么为什么需要/定义这些额外的文件打开模式?使用它们的目的是什么,何时使用前四个以及何时在处理文件时使用后四个?

请清除我的疑问,帮助我。  如果你能用一些恰当的例子来解释它对我和其他社区成员来说真的很棒,也很有帮助。

感谢。

2 个答案:

答案 0 :(得分:4)

简而言之,“+”表示文件已打开以进行读写。

From the PHP doc

  

'r'仅供阅读;将文件指针放在文件的开头。

     

'r +'开放阅读和写作;将文件指针放在文件的开头。

     

'w'仅供写作;将文件指针放在文件的开头,并将文件截断为零长度。如果该文件不存在,请尝试创建它。

     

'w +'开放阅读和写作;将文件指针放在文件的开头,并将文件截断为零长度。如果该文件不存在,请尝试创建它。

     

'a'仅供写作;将文件指针放在文件的末尾。如果该文件不存在,请尝试创建它。

     

'a +'开放阅读和写作;将文件指针放在文件的末尾。如果该文件不存在,请尝试创建它。

     

'x'创建并打开仅供写入;将文件指针放在文件的开头。如果文件已存在,则fopen()调用将失败,返回FALSE并生成级别为E_WARNING的错误。如果该文件不存在,请尝试创建它。这相当于为底层open(2)系统调用指定O_EXCL | O_CREAT标志。

     

'x +'创建并打开阅读和写作;否则它与'x'具有相同的行为。

     

'c'打开文件只写。如果该文件不存在,则创建该文件。如果存在,则既不截断(与'w'相反),也不会调用此函数失败(如'x'的情况)。文件指针位于文件的开头。如果在尝试修改文件之前需要获取咨询锁(请参阅flock()),这可能很有用,因为使用'w'可能会在获取锁之前截断文件(如果需要截断,则ftruncate()可以在请求锁定后使用。)

     

'c +'打开文件进行读写;否则它与'c'具有相同的行为。

答案 1 :(得分:3)

因此,让我们通过所有这些模式,看看他们做了什么:

  • 模式:r 使用模式r,您只能读取存在的文件,意味着如果文件不存在也不能创建文件,也不能创建文件写进去:

    1. 尝试访问不存在的文件:

      $filename = "test.txt"; //file does not exists 
      $h = fopen($filename, "r");
      
    2. 这将导致错误:

        

      警告:fopen(test.txt):无法打开流:没有这样的文件或目录

      因为该文件不存在且无法创建。

      1. 尝试写入文件:

        $filename = "test.txt"; //file does exists
        $h = fopen($filename, "r");
        fwrite($h, "TEST");
        fclose($h);
        
      2. 这不会引发任何错误,但fwrite()如果执行:var_dump(fwrite($h, "TEST"));将返回FALSE,因为它无法写入模式为r的文件。

        1. 尝试阅读文件:

          $filename = "test.txt"; //file does exists
          $h = fopen($filename, "r");
          $content = fread($h, filesize($filename));
          fclose($h);
          
          print_r($content);
          
        2. 代码将正常运行,您将显示文件中的全部内容。

        3. 模式:r + 此模式类似于模式r,但它有点不同,即您可以写入文件。

          1. 尝试写入文件:

            $filename = "test.txt"; //file does exists
            $h = fopen($filename, "r+");
            fwrite($h, "TEST");
            fclose($h);
            
          2. 与以前相同的代码,但如果不同,var_dump(fwrite($h, "TEST"));将返回它写入文件的字节数(此处为int(4))。

            另请注意,如果您在其中写入内容,它将覆盖该文件。否则模式r +与模式r具有相同的行为,读取文件并打开不存在的文件。

          3. 模式:w 使用此模式,您只能写入文件,因此无法读取该文件,如果该文件不存在,则会尝试创建文件。与r +一样,如果您写入文件,它将覆盖其中的所有内容。

            1. 尝试访问不存在的文件:

              $filename = "test.txt"; //file does not exists 
              $h = fopen($filename, "w");
              fclose($h);
              
            2. 因此,此代码将正常工作,并且不会给您任何错误。由于文件不存在,它只是简单地尝试创建它。

              1. 尝试写入文件:

                $filename = "test.txt"; //file can exist or not, doesn't make a difference
                $h = fopen($filename, "w");
                fwrite($h, "TEST");
                fclose($h);
                
              2. 此代码也可以正常工作,它会将内容写入您的文件。正如我所说它会覆盖文件!

                1. 尝试阅读文件:

                  $filename = "test.txt"; //file can exist or not, doesn't make a difference
                  $h = fopen($filename, "w");
                  $content = fread($h, filesize($filename));
                  fclose($h);
                  
                  print_r($content);
                  
                2. 此代码最终会出现警告:

                    

                  警告:fread():长度参数必须大于0

                  因为通过使用模式w访问文件,文件将被截断为零长度。因此,您无法使用fread()读取任何内容。 (在w +模式的例子中还有更多关于此的内容)

                3. 模式:w + 此模式类似于具有差异的模式w,您也可以阅读该文件。

                  1. 尝试阅读文件:

                    $filename = "test.txt"; 
                    $h = fopen($filename, "w+");
                    fwrite($h, "TEST");
                    fseek($h, 0); //See footnote 1
                    $content = fread($h, filesize($filename));
                    fclose($h);
                    
                    print_r($content);
                    
                  2. 此代码可以正常工作并打印出来:TEST。这与模式w相同,它会将文件截断为零长度,意味着在打开文件后你必须在其中写入内容,然后你就可以阅读它了。

                    脚注:打开文件后它的长度为零,所以你必须在里面写一些东西,你可以读一些东西。但现在就是这样,如果你打开文件,文件指针将位于文件的开头。然后当你写一些东西,例如" XY"指针将位于2,因此如果您尝试阅读它,则从2开始 - >你读了这个文件,所以很明显没有内容,所以你必须用fseek()将文件指针设置回头来读取整个文件。

                  3. 模式:a:因此,在模式a中,您可以将文字附加到文件中,但您无法读取它。如果文件不存在,它将尝试创建它。

                    1. 尝试访问不存在的文件:

                      $filename = "test.txt"; //file does not exists 
                      $h = fopen($filename, "a");
                      fclose($h);
                      
                    2. 此代码的行为与模式w相似。如果文件不存在,它会尝试创建它。

                      1. 尝试写入文件:

                        $filename = "test.txt"; //file can exist or not, doesn't make a difference
                        $h = fopen($filename, "a");
                        fwrite($h, "TEST");
                        fclose($h);
                        
                      2. 此代码的工作方式类似于模式w,但区别在于,如果您的文件中已有某些内容,则不会被覆盖。

                        1. 尝试阅读文件:

                          $filename = "test.txt"; //file can exist or not, doesn't make a difference
                          $h = fopen($filename, "a");
                          $content = fread($h, filesize($filename));
                          fclose($h);
                          
                          print_r($content);
                          
                        2. 这不会像你得到警告的模式w那样结束,因为它在打开文件时不会覆盖文件。但是fread()也会返回FALSE,因为你无法用模式a读取文件。

                        3. 模式:a + 此模式类似于模式a,但区别在于您还可以读取文件。

                          1. 尝试阅读文件:

                            $filename = "test.txt"; 
                            $h = fopen($filename, "a+");
                            $content = fread($h, filesize($filename));
                            fclose($h);
                            
                            print_r($content);
                            
                          2. 如果文件中包含内容,您将能够阅读它,并将其作为输出。

                          3. 模式:x 此模式用于创建用于写入的文件。如果文件已经存在,它会给你一个警告。

                            1. 尝试创建文件:

                              $filename = "test.txt";  //file does not exists
                              $h = fopen($filename, "x");
                              
                            2. 此代码将创建文件没有问题。如果它已经存在,你会收到错误。

                              1. 尝试阅读文件:

                                $filename = "test.txt";  //file does not exists
                                $h = fopen($filename, "x");
                                $content = fread($h, filesize($filename));
                                fclose($h);
                                
                              2. 这将与此处的模式w具有相同的行为。

                                1. 尝试写入文件:

                                  $filename = "test.txt";  //file does not exists
                                  $h = fopen($filename, "x");
                                  fwrite($h, "TEST");
                                  fclose($h);
                                  
                                2. 这也与模式w在这里有相同的行为,你可以写入文件。

                                3. 模式:x + 正如您已经猜到的那样,如果您看到其他模式的模式,+也允许从文件中读取。

                                  1. 尝试阅读文件:

                                    $filename = "test.txt";  //file does not exists
                                    $h = fopen($filename, "x+");
                                    fwrite($h, "TEST");
                                    fseek($h, 0); //See the footnote on mode w+
                                    $content = fread($h, filesize($filename));
                                    fclose($h);
                                    
                                  2. 阅读将按预期正常工作。

因为你可以看到这些模式都是不同的,并且允许/允许不同的事情。这就是为什么它们存在并且根据您的需要,您可以选择一种模式来打开文件。

我希望这些例子清楚地向您展示所有这些模式之间的差异。如果您想了解有关模式和功能的更多信息,请参阅手册: