php如何判断文件是否存在,包括本地和远程文件

1,当检查的文件是本地时用php自带的file_exists检查就行了,而此函数只能检查本地的函数是否存在,

所以如果要检查远程的文件是否存在只能用其它的方法了。

如果所服务器中php的配置开启了“allow_url_fopen = On”,即允许远端访问,那么也很简单,其实这个是php.ini中默认开启的,

用fopen函数判断就行了,能打开说明存在

如果allow_url_fopen = Off那么可以用socket通讯来解决

下面写的一个通用函数my_file_exists来检查文件是否存在

[php]  view plain copy
  1. function my_file_exists($file)  
  2. {  
  3.     if(preg_match('/^http:\/\//',$file)){  
  4.         //远程文件  
  5.         if(ini_get('allow_url_fopen')){  
  6.             if(@fopen($file,'r')) return true;  
  7.         }  
  8.         else{  
  9.             $parseurl=parse_url($file);  
  10.             $host=$parseurl['host'];  
  11.             $path=$parseurl['path'];  
  12.             $fp=fsockopen($host,80, $errno$errstr, 10);  
  13.             if(!$fp)return false;  
  14.             fputs($fp,"GET {$path} HTTP/1.1 \r\nhost:{$host}\r\n\r\n");  
  15.             if(preg_match('/HTTP\/1.1 200/',fgets($fp,1024))) return true;  
  16.         }  
  17.         return false;  
  18.     }  
  19.     return file_exists($file);  
  20. }  

现在就可以调用此函数来检查文件的存在性,而不用去考虑是远程还是本地文件,或者是否禁用了allow_url_open

2,

view source

1 $file "http://www.oschina.net/demo/file_exists.zip";
2 $fileExists = @file_get_contents($file,null,null,-1,1) ? true : false ;
3  
4 if($fileExists){
5      echo "File Exists!";
6 }else{
7      echo "Sorry, we couldn't find the file.";
8 }

3,

fopen()方法

最简单的方法就是用fopen(),看看文件能否打开,能打就文件当然就存在。

01 <?php
03  
04 if( @fopen$url'r' ) )
05 {
06     echo 'File Exits';
07 }
08 else
09 {
10     echo 'File Do Not Exits';
11 }
12 ?>

fopen() 函数打开文件或者 URL。如果打开失败,函数会返回 FALSE。

语法:fopen(filename,mode,include_path,context)

参数 描述
filename 必需。规定要打开的文件或 URL。
mode 必需。规定要求到该文件/流的访问类型。可能的值见下表。
include_path 可选。如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 TRUE。
context 可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。

mode 参数的可能的值:

mode 说明
"r" 只读方式打开,将文件指针指向文件头。
"r+" 读写方式打开,将文件指针指向文件头。
"w" 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
"w+" 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
"a" 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
"a+" 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
"x" 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。
"x+" 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。

fopen() 将 filename 指定的名字资源绑定到一个流上。如果 filename 是 "scheme://..." 的格式,则被当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,PHP 将发出一条消息来帮助检查脚本中潜在的问题并将 filename 当成一个普通的文件名继续执行下去。

如果 PHP 认为 filename 指定的是一个本地文件,将尝试在该文件上打开一个流。该文件必须是 PHP 可以访问的,因此需要确认文件访问权限允许该访问。如果激活了安全模式或者 open_basedir 则会应用进一步的限制。

如果 PHP 认为 filename 指定的是一个已注册的协议,而该协议被注册为一个网络 URL,PHP 将检查并确认 allow_url_fopen 已被激活。如果关闭了,PHP 将发出一个警告,而 fopen 的调用则失败。

一个fopen的用法

1 <?php
2 $file fopen("test.txt","r");
3 $file fopen("/home/test/test.txt","r");
4 $file fopen("/home/test/test.gif","wb");
5 $file fopen("http://www.example.com/","r");
6 $file fopen("ftp://user:password@example.com/test.txt","w");
7 ?>

但是如果图片资源所在服务器挂掉了,这个函数会一直等待,所以我们需要一个备用方案。

CURL 方法

CURL是个很好用的类库,下面看下如何用它来判断。

01 <?php
03  
04 $ch = curl_init();
05 $timeout = 10;
06 curl_setopt ($ch, CURLOPT_URL, $url2);
07 curl_setopt($ch, CURLOPT_HEADER, 1);
08 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
09 curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
10  
11 $contents = curl_exec($ch);
12 //echo $contents;
13 if (preg_match("/404/"$contents)){
14     echo '文件不存在';
15 }
16 ?>

curl_exec()执行完之后如果文件不存在,会返回如下信息:

1 HTTP/1.1 404 Not Found
2 Date: Tue, 14 Feb 2012 05:08:34 GMT
3 Server: Apache
4 Accept-Ranges: bytes
5 Content-Length: 354
6 Content-Type: text/html

用正则看看是否有404,有的话文件就不存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值