PHP高级语法(一)—— 文件处理2

 

 

file

(PHP 3, PHP 4, PHP 5)

file -- 把整个文件读入一个数组中

说明

array file ( string filename [, int use_include_path [, resource context]] )

readfile() 一样,只除了 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败 file() 返回 FALSE

如果也想在 include_path 中搜寻文件的话,可以将可选参数 use_include_path 设为 "1"。

 

<?php
// 将一个文件读入数组。本例中通过 HTTP 从 URL 中取得 HTML 源文件。
$lines = file ( 'http://www.example.com/' );
// 在数组中循环,显示 HTML 的源文件并加上行号。
foreach ( $lines as $line_num => $line ) {
    echo
"Line #<b> { $line_num } </b> : " . htmlspecialchars ( $line ) . "<br />/n" ;
}
// 另一个例子将 web 页面读入字符串。参见 file_get_contents()。
$html = implode ( '' , file ( 'http://www.example.com/' ));
?>

提示: 如果“fopen wrappers” 已经被激活,则在本函数中可以把 URL 作为文件名来使用。请参阅 fopen() 函数来获取怎样指定文件名的详细信息以及支持 URL 封装协议的列表:附录 L 。

注: 返回的数组中每一行都包括了行结束符,因此如果不需要行结束符时还需要使用 rtrim() 函数。

注: 如果碰到 PHP 在读取文件时不能识别 Macintosh 文件的行结束符,可以激活 auto_detect_line_endings 运行时配置选项。

注: 从 PHP 4.3.0 开始可以用 file_get_contents() 来将文件读入到一个字符串返回。

从 PHP 4.3.0 开始 file() 可以安全用于二进制文件。

注: 对 context 的支持是 PHP 5.0.0 添加的。有关 context 的说明请参考参考 CXLI, Stream Functions

 

chmod

(PHP 3, PHP 4, PHP 5)

chmod -- 改变文件模式

说明

bool chmod ( string filename, int mode )

尝试将 filename 所指定文件的模式改成 mode 所给定的。

注意 mode 不会被自动当成八进制数值,而且也不能用字符串(例如 "g+w")。要确保正确操作,需要给 mode 前面加上 0:

 

<?php
chmod
( "/somedir/somefile" , 755 );    // 十进制数,可能不对
chmod ( "/somedir/somefile" , "u+rwx,go+rx" ); // 字符串,不对
chmod ( "/somedir/somefile" , 0755 );   // 八进制数,正确的 mode 值
?>

mode 参数包含三个八进制数按顺序分别指定了所有者、所有者所在的组以及所有人的访问限制。每一部分都可以通过加入所需的权限来计算出所要的权限。数字 1 表示使文件可执行,数字 2 表示使文件可写,数字 4 表示使文件可读。加入这些数字来制定所需要的权限。有关 UNIX 系统的文件权限可以阅读手册“man 1 chmod”和“man 2 chmod”。

 

<?php
// Read and write for owner, nothing for everybody else
chmod ( "/somedir/somefile" , 0600 );

// Read and write for owner, read for everybody else
chmod ( "/somedir/somefile" , 0644 );

// Everything for owner, read and execute for others
chmod ( "/somedir/somefile" , 0755 );

// Everything for owner, read and execute for owner's group
chmod ( "/somedir/somefile" , 0750 );
?>

如果成功则返回 TRUE ,失败则返回 FALSE

注: 当前用户指的是执行 PHP 的用户。很可能和通常的 shell 或者 FTP 用户不是同一个。在大多数系统下文件模式只能被文件所有者的用户改变。

注: 本函数不能作用于远程文件 ,被检查的文件必须通过服务器的文件系统访问。

注: 当安全模式 打开的时候,PHP 会检查所操作的文件是否和正在执行的脚本具有相同的 UID (所有者)。要注意的是,不能修改 SUID,SGID 和 sticky bits。

还有chgrp()和chown()函数与其类似,想知道自己去看用户手册

 

fread

(PHP 3, PHP 4, PHP 5)

fread -- 读取文件(可安全用于二进制文件)

说明

string fread ( int handle, int length )

fread() 从文件指针 handle 读取最多 length 个字节。 该函数在读取完 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时就会停止读取文件,视乎先碰到哪种情况。

 

// get contents of a file into a string
$filename = "/usr/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize ($filename));
fclose($handle);
警告

在区分二进制文件和文本文件的系统上(如 Windows)打开文件时,fopen() 函数的 mode 参数要加上 'b'。

 

$filename = "c://files//somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize ($filename));
fclose($handle);
警告

当从网络流或者管道读取时,例如在读取从远程文件 或 popen() 以及 proc_open() 的返回时,读取会在一个包可用之后停止。这意味着你应该如下例所示将数据收集起来合并成大块。

 

<?php
$handle
= fopen ( "http://www.example.com/" , "rb" );
$contents = "" ;
while (!
feof ( $handle )) {
  
$contents .= fread ( $handle , 8192 );
}
fclose ( $handle );
?>

注: 如果你只是想将一个文件的内容读入到一个字符串中,用 file_get_contents() ,它的性能比上面的代码好得多。

 

fwrite

(PHP 3, PHP 4, PHP 5)

fwrite -- 写入文件(可安全用于二进制文件)

说明

int fwrite ( resource handle, string string [, int length] )

fwrite() 把 string 的内容写入 文件指针 handle 处。 如果指定了 length ,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。

fwrite() 返回写入的字符数,出现错误时则返回 FALSE

注意如果给出了 length 参数,则 magic_quotes_runtime 配置选项将被忽略,而 string 中的斜线将不会被抽去。

注: 在区分二进制文件和文本文件的系统上(如 Windows) 打开文件时,fopen() 函数的 mode 参数要加上 'b'。

例子 1. 一个简单的 fwrite() 例子

<?php
$filename
= 'test.txt' ;
$somecontent = "添加这些文字到文件/n" ;

// 首先我们要确定文件存在并且可写。
if ( is_writable ( $filename )) {

    
// 在这个例子里,我们将使用添加模式打开$filename,
    // 因此,文件指针将会在文件的开头,
    // 那就是当我们使用fwrite()的时候,$somecontent将要写入的地方。
    
if (! $handle = fopen ( $filename , 'a' )) {
         echo
"不能打开文件 $filename" ;
         exit;
    }

    
// 将$somecontent写入到我们打开的文件中。
    
if ( fwrite ( $handle , $somecontent ) === FALSE ) {
        echo
"不能写入到文件 $filename" ;
        exit;
    }

    echo
"成功地将 $somecontent 写入到文件$filename" ;

    
fclose ( $handle );

} else {
    echo
"文件 $filename 不可写" ;
}
?>

 

file_exists

(PHP 3, PHP 4, PHP 5)

file_exists -- 检查文件或目录是否存在

说明

bool file_exists ( string filename )

如果由 filename 指定的文件或目录存在则返回 TRUE ,否则返回 FALSE

在 Windows 中要用 //computername/share/filename 或者 //computername/share/filename 来检查网络中的共享文件。

例子 1. 测试一个文件是否存在

<?php
$filename
= '/path/to/foo.txt' ;

if (
file_exists ( $filename )) {
    echo
"The file $filename exists" ;
} else {
    echo
"The file $filename does not exist" ;
}
?>

注: 本函数的结果会被缓存。更多信息参见 clearstatcache()

提示: 自 PHP 5.0.0 起本函数也可被某些 URL wrapper 使用。参考附录 L 来看哪些 wrapper 支持 stat() 系列函数的功能。

警告

如果因为安全模式 的限制而导致不能访问文件的话,该函数会返回 FALSE 。然而,如果文件在 safe_mode_include_dir 所指定的目录内的话,仍然可以使用 include 来包含。

 

fseek

(PHP 3, PHP 4, PHP 5)

fseek -- 在文件指针中定位

说明

int fseek ( resource handle, int offset [, int whence] )

在与 handle 关联的文件中设定文件指针位置。新位置,从文件头开始以字节数度量,是以 whence 指定的位置加上 offset 。whence 的值定义为:

SEEK_SET - 设定位置等于 offset 字节。
SEEK_CUR - 设定位置为当前位置加上 offset 。
SEEK_END - 设定位置为文件尾加上 offset 。(要移动到文件尾之前的位置,需要给 offset 传递一个负值。)

如果没有指定 whence ,默认为 SEEK_SET

成功则返回 0;否则返回 -1。注意移动到 EOF 之后的位置不算错误。

例子 1. fseek() 例子

<?php

$fp
= fopen ( 'somefile.txt' );

// read some data
$data = fgets ( $fp , 4096 );

// move back to the begining of the file
// same as rewind($fp);
fseek ( $fp , 0 );

?>

可能不能用于在 fopen() 中以 "http://" 或 "ftp://" 格式打开所返回的文件指针。在附加模式(加参数 "a" 打开文件)中 ftell() 会返回未定义错误。

注: whence 参数是 PHP 4.0.0 之后增加的。

注: 如果你使用附加模试("a" 或 "a+"),任何写入文件数据都会被附加上去,而文件的位置将会被忽略。

copy

(PHP 3, PHP 4, PHP 5)

copy -- 拷贝文件

说明

bool copy ( string source, string dest )

将文件从 source 拷贝到 dest 。如果成功则返回 TRUE ,失败则返回 FALSE

例子 1. copy() 例子

<?php
$file
= 'example.txt' ;
$newfile = 'example.txt.bak' ;

if (!
copy ( $file , $newfile )) {
    echo
"failed to copy $file... /n " ;
}
?>

如果要移动文件的话,请使用 rename() 函数。

注: 从 PHP 4.3.0 开始,如果启用了“fopen wrappers”的话,source 和 dest 都可以是 URL。更多细节见 fopen() 。如果 dest 是一个 URL,则如果封装协议不支持覆盖已有的文件时拷贝操作会失败。

警告

如果目标文件已存在,将会被覆盖。

 

 

file_get_contents

(PHP 4 >= 4.3.0, PHP 5)

file_get_contents -- 将整个文件读入一个字符串

说明

string file_get_contents ( string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]] )

file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE

file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。

注: 如果要打开有特殊字符的 URL (比如说有空格),就需要使用 urlencode() 进行 URL 编码。

注: context 参数可以用 NULL 来忽略。

更新日志

 

版本 说明
5.0.0 添加了对 context 的支持。
5.1.0 添加了 offset 和 maxlen 参数。

注释

注: 本函数可安全用于二进制对象。

 

file_put_contents

(PHP 5)

file_put_contents -- 将一个字符串写入文件

说明

int file_put_contents ( string filename, string data [, int flags [, resource context]] )

和依次调用 fopen()fwrite() 以及 fclose() 功能一样。

参数 data 可以是数组(但不能为多元数组),这就相当于 file_put_contents($filename, join('', $array))

自 PHP 5.1.0 起,data 参数也可以被指定为 stream 资源,这里 stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用 stream_copy_to_stream() 函数。

参数

 

filename

要被写入数据的文件名

data

要写入的数据。类型可以是 stringarray 或者是 stream 资源(如上面所说的那样).

flags

flags 可以是 FILE_USE_INCLUDE_PATH , FILE_APPEND 和/或 LOCK_EX (获得一个独占锁定),然而使用 FILE_USE_INCLUDE_PATH 时要特别谨慎。

context

一个 context 资源

返回值

该函数将返回写入到文件内数据的字节数

更新日志

 

版本 说明
5.1.0 添加了对 LOCK_EX 的支持和 data 参数处理 stream 资源的功能。

注释

注: 本函数可安全用于二进制对象

 

你可能感兴趣的:(PHP,String,Stream,File,include,wrapper)