php 文件目录操作函数

 更新时间:2016年11月25日 17:29  点击:1567
在php中我们有大量的可对文件与目录操作的函数,下面我来总结一下这些函数的用法,有需要学习的朋友可参考参考。

mkdir();函数

php创建文件夹和文件

///创建文件夹

 代码如下 复制代码
function createdir($dir)
{
if(file_exists($dir) && is_dir($dir)){//如果存在这个文件并且这个文件是个目录就不动作
}
else{
   mkdir($dir,0777);//否则就创造这个目录
}
}

file_exists();函数

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

 代码如下 复制代码

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

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

is_dir();函数

is_dir();测试文件是否为目录。
为目录就返回true,不就返回false


is_file();

Is_File('目标文件路径和文件名')
为文件返回"True",不为文件返回"False"。


is_link();
文件系统函数库

is_link();测试文件是否为链接文件。
true 值则表示指定的 filename 存在并为符号链接文件.

rmdir 命令
功能:删除空目录
rmdir [选项] dirname
- p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因

保留部分路径,则系统在标准输出上显示相应的信息。

要清空并除去目录,请输入:

rm mydir/* mydir/.*
rmdir mydir
该命令除去 mydir 文件中的内容接着除去空目录。rm 命令显示一条关于尝试除去目录 .(点)和.. (点,点)的错

误消息,然后 rmdir 命令除去它们。


建立一个文件名字为aa.txt

 代码如下 复制代码

$fp=fopen('aa.txt',   'w+');   //建立一新文件  
chmod('aa.txt',   0777);   //设定权限,不然的话建立后无法修改,删除   //好象这行不用也可以
fwrite($fp,   '要写入的内容');   //写内容  
fclose($fp);   //关闭文件

unlink()函数
功能:删除文件
unlink($filename)删除文件名为$filename的文件


删除指定目录下的所有文件

 代码如下 复制代码

function dir_clear($dir) {
    $directory = dir($dir);                //创建一个dir类(Php手册上这么说的),用来读取目录中的每一个文


    while($entry = $directory->read()) {   //循环每一个文件,并取得文件名$entry
        $filename = $dir.'/'.$entry;       //取得完整的文件名,带路径的
        if(is_file($filename)) {           //如果是文件,则执行删除操作
            @unlink($filename);
        }
    }
    $directory->close();                   //关闭读取目录文件的类
    result();
}


列出目录中包括子目录的所有文件程序

 

 代码如下 复制代码

<?php
/*
 * PHP 读取目录下及其子目下的文件函数
 * */
$files=getFile("images");//调用函数
foreach ($files as $name){
 echo "$name"."<br>";
}
 
function getFile($dir){
 $files=array();
 if (is_file($dir)){//如果指定路径为文件直接返回
  return $dir;
 }
 
 $hande=opendir($dir);
 
 if ($hande){
  while (false!==($ufile=readdir($hande))){//如果读取目录成功
   if ($ufile!="." && $ufile!=".."){
    $filename=$dir."/".$ufile;
    if (is_file($filename)){
     $files[]=$filename;
    }else{
     $files=array_merge($files,getFile($filename));
    }
   }
  }//end While
  closedir($hande);
 }//end if
 
 return $files;
}
?>

删除指定目录下的所有文件以及所有文件夹以及本身***强烈推荐这种方法!!!
 

 代码如下 复制代码
function rmdir_tree($dirname)//定义一个函数rmdir_tree,要删除的文件名为$dirname
{
$handle=opendir($dirname);//打开名为$dirname的文件夹
while ($file=readdir($handle)) //跑回圈读取打开的文件夹
{
    if (($file==".") || ($file=="..")) continue;//继续跑的条件,如果不满足就不跑了
    $fullname=$dirname."/".$file;//完整的文件名(包括路径)
    if (filetype($fullname)=="dir")
      rmdir_tree($fullname);//调用刚刚定义的函数,实现递归
    else
      unlink($fullname);//删除文件
}
closedir($handle);//关闭打开了的文件夹
rmdir($dirname);//删除自身(文件夹)
}
在php中魔术方法与关键字都是我们常用的,关键字有final、static 、const,魔术方法__call()、__toString() 、_clone() 、__autoload() 等等。

PHP中常用的关键字

final  

1、final只能修饰类和方法,不能修饰成员属性   作用:使用修饰的类不能被继承,修饰的方法不能被覆盖

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为

final,则不能被继承。

Example #1 Final 方法示例

 代码如下 复制代码

<?php
class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }
  
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() called\n";
   }
}
// 产生 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
Example #2 Final 类示例

<?php
final class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }
  
   // 这里无论你是否将方法声明为final,都没有关系
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
}
// 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>


static 
 
1.使用static可以修饰成员属性和成员方法,不能修饰类  
2.用static修饰的成员属性,可以被同一个类的所有对象共享  
3.静态的数据是存在于内存中的数据段中(初使化静态段)  
4.静态的数据是在类第一次加载时分配到内存中的,后面用到时就可以直接使用了  
5.只要在程序中有这个类名出现,即是类被加载,静态数据就会被分配到内存中了   注:静态的成员都要使用类名访

问,不用创建对象,不要用对象去访问静态成员。   访问方法 类名::静态成员   如果在类中使用静态成员,可以使

用self代表本类   访问方法 self::静态成员  
6.静态方法不能访问非静态成员,非静态方法可以访问静态成员,因为非静态成员必须用对象来访问,而静态成员不需

例1

 代码如下 复制代码

<?php
function test()
{
    static $var1=1;
    $var1+=2;
    echo $var1.' ';
}

test();
test();
test();
?>

例2

例子:

 代码如下 复制代码

<?php
Class Person{
    // 定义静态成员属性
    public static $country = "中国";
    // 定义静态成员方法
    public static function myCountry() {
        // 内部访问静态成员属性
        echo "我是".self::$country."人<br />";
    }
}
class Student extends Person {
    function study() {
        echo "我是". parent::$country."人<br />";
    }
}
// 输出成员属性值
echo Person::$country."<br />";  // 输出:中国
$p1 = new Person();
//echo $p1->country;   // 错误写法
// 访问静态成员方法
Person::myCountry();   // 输出:我是中国人
// 静态方法也可通过对象访问:
$p1->myCountry();

// 子类中输出成员属性值
echo Student::$country."<br />"; // 输出:中国
$t1 = new Student();
$t1->study();    // 输出:我是中国人
?>

运行该例子,输出:

中国
我是中国人
我是中国人
中国
我是中国人


首先,我们知道PHP中调用实例方法都是通过如:someobj->someFun()调用,那么我们调用静态函数是否也能像C#那样

通过SomeClass->someFun()调用呢?答案是否定的,在PHP中,对静态成员的调用只能通过::的方式进行,如:

SomeClass::someFun()。

 

 代码如下 复制代码
<?php
class TestC
{
    public static $var1=1;
    public $var2=1;
    function t1()
 {
        self::$var1+=2;
        echo self::$var1.'&nbsp;';
        echo $this->var2.'&nbsp;';
    }
    public static function t2()
 {
        self::$var1+=2;
        echo self::$var1.'&nbsp;';
    }
}
$t=new TestC();
$t->t1();
TestC::t2();
?>

const  
1.const只能修饰成员属性  
2.类中使用const声明常量  
3.用法类似定义一般常量  
4.访问方式和静态成员是一样的(在类外 类名::常量名,类内 self::常量名)  
5.常量一定要在声明时就给初值

语法:

const constant = "value";
例子:

 代码如下 复制代码

<?php
Class Person{
    // 定义常量
    const country = "中国";

    public function myCountry() {
        //内部访问常量
        echo "我是".self::country."人<br />";
    }
}

// 输出常量
echo Person::country."<br />";

// 访问方法
$p1 = new Person();
$p1 -> myCountry();
?>

运行该例子输出:

中国
我是中国人


PHP中小常用魔术方法:

__call()   在调用对象中不存在的方法时,就会调用此方法。就会出现系统报错,然后程序会退出。声明此方法来对

错误进行操作,阻止程序崩溃。

__toString()   直接输出对象引用时调用,用来快速获取对象的字符串表示的最便捷的方式

 代码如下 复制代码

<?php
// Declare a simple class
class TestClass
{
    public $foo;

    public function __construct($foo)
    {
        $this->foo = $foo;
    }

    public function __toString() {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
echo $class;
?>


 

void __clone ( void )
当复制完成时, 如果定义了__clone()方法, 则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可

用于修改属性的值(如果有必要的话)。

 

 代码如下 复制代码

<?php
class SubObject
{
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }

    public function __clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {
     
        // 强制复制一份this->object, 否则仍然指向同一个对象
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;


print("Original Object:\n");
print_r($obj);

print("Cloned Object:\n");
print_r($obj2);

?>

__autoload()   其它的魔术方法都是在类中添加起作用,这个是唯一一个不在类中添加的方法   只要在页面中使用

到一个类,只要用到类名就会自动传进此方法

 代码如下 复制代码

<?php
session_start();
require_once 'MyClass.php';
$obj = new MyClass;
$_SESSION['obj'] = $obj;
?>

Works fine.  Then on a subsequent page load:

 代码如下 复制代码

<?php
session_start();
require_once 'MyClass.php';
$_SESSION['obj']->callSomeMethod();
?>

Fatal error:  The script tried to execute a method or access a property of an incomplete object. Please

ensure that the class definition "MyClass" of the object you are trying to operate on was loaded

_before_ unserialize() gets called or provide a __autoload() function to load the class definition.

But if you do this instead, it works fine:

 代码如下 复制代码

<?php
require_once 'MyClass.php';
session_start();
$_SESSION['obj']->callSomeMethod();
?>


对象串行化:将一个对象转化为二进制串   1.将对象长时间存储在数据库或文件中时   2.将对象在多个PHP文件中传

输时   serialize():参数是一个对象,返回的是一个二进制串   unserialize():参数是对象的二进制串,返回的就是

新生成的对象    __sleep()   在序列化时自动调用的方法(serialize)   作用:可以将一个对象部分序列化   只要

这个方法中返回一个数据组,数组中有几个成员属性就序列化几个成员属性,如果不加,所有成员属性都被序列化 

__wakeup()   在反序列化时自动调用的方法(unserialize)   也就是对象重新诞生的一个过程

注意事项:PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以当你定义类方法时,除了上述魔术方法,

建议不要以 __为前缀。

昨天有一朋友说自己的phpmyadmin不能登录并且无任何提示了,问我怎么解决,下面我来分享一下关于phpmyadmin不能登录问题总结.

phpmyadmin不能登录没有提示

解决方法:


1.在php的目录建立个文件夹tmp(如C:/php/tmp),设置tmp属性为ervery one完全控制
2.在php.ini找到session.save_path 这一行,设成session.save_path = “C:/php/tmp”,并把前面的分号去掉


以上的C:/php/tmp根据你实际情况设定


3.重启IIS服务。

终极解决方法

导致上述问题和一些与php程序相关的错误(如:xcache缓存功能不生效;php不保存session),根源在于,没有给php设

置temp目录!


1.在 c:windows下建立 temp 文件夹(用户存放php的文件),并设置相应的读写NTFS权限,确保php能正常访问此

目录


2.重启IIS.

 

简单带上phpMyAdmin登陆超时(1440秒未活动)解决办法


在phpMyAdmin所在目录找到 / libraries / config.default.php 文件,打开,修改

$cfg['LoginCookieValidity'] = 1440;    将1440修改成更大的值即可解决“现象一”

如果修改:$cfg['LoginCookieValidity']的值小于或等于php.ini里的session.gc_maxlifetime的值,即可解决”现

象二“

总结:最前讲述的是iis+php下重启iis,如果是apache我们重启apache即可了。

本文章完美的利用了php的curl功能实现模拟登录discuz以及模拟发帖,本教程供参考学习哦。
 代码如下 复制代码

<?php

$discuz_url = ‘http://localhost/klive/root/Discuz_X2.5_SC_GBK/’;//论坛地址
$login_url = $discuz_url .’member.php?mod=logging&action=login’;//登录页地址

$post_fields = array();
//以下两项不需要修改
$post_fields['loginfield'] = ‘username’;
$post_fields['loginsubmit'] = ‘true’;
//用户名和密码,必须填写
$post_fields['username'] = ‘admin’;
$post_fields['password'] = ‘admin’;
//安全提问
$post_fields['questionid'] = 0;
$post_fields['answer'] = ”;
//@todo验证码
$post_fields['seccodeverify'] = ”;

//获取表单FORMHASH
$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
preg_match(‘/<inputs*type=”hidden”s*name=”formhash”s*value=”(.*?)”s*/>/i’, $contents,

$matches);
if(!empty($matches)) {
$formhash = $matches[1];
} else {
die(‘Not found the forumhash.’);
}

//POST数据,获取COOKIE,cookie文件放在网站的temp目录下
$cookie_file = tempnam(‘./temp’,'cookie’);

$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_exec($ch);
curl_close($ch);

//取到了关键的cookie文件就可以带着cookie文件去模拟发帖,fid为论坛的栏目ID
$send_url = $discuz_url.”forum.php?mod=post&action=newthread&fid=2″;

$ch = curl_init($send_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
$contents = curl_exec($ch);
curl_close($ch);
//这里的hash码和登陆窗口的hash码的正则不太一样,这里的hidden多了一个id属性
preg_match(‘/<inputs*type=”hidden”s*name=”formhash”s*id=”formhash”s*value=”(.*?)”s*/>/i

’, $contents, $matches);
if(!empty($matches)) {
$formhash = $matches[1];
} else {
die(‘Not found the forumhash.’);
}

$post_data = array();
//帖子标题
$post_data['subject'] = ‘test2′;
//帖子内容
$post_data['message'] = ‘test2′;
$post_data['topicsubmit'] = “yes”;
$post_data['extra'] = ”;
//帖子标签
$post_data['tags'] = ‘test’;
//帖子的hash码,这个非常关键!假如缺少这个hash码,discuz会警告你来路的页面不正确
$post_data['formhash']=$formhash;

$ch = curl_init($send_url);
curl_setopt($ch, CURLOPT_REFERER, $send_url);       //伪装REFERER
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$contents = curl_exec($ch);
curl_close($ch);

//清理cookie文件
unlink($cookie_file);

?>

使用商城的朋友可能会经常碰到关于利用ecshop来实现一些活动的需求,把电影票设置为免运费。但是事实情况却事与愿违,消费者购买订单超过100元并添加免运费的赠品后,订单反而又要收取邮费

flow.php

 代码如下 复制代码

/* 添加赠品到购物车 */
foreach ($favourable['gift'] as $gift)
{
    if (in_array($gift['id'], $_POST['gift']))
    {
        add_gift_to_cart($act_id, $gift['id'], $gift['price']);
    }
}

出问题的地方正是函数“add_gift_to_cart”,找到函数的定义,仍在在flow.php文件,

我把该函数修改后的源码贴出来,大家对照一下就明白了:

 代码如下 复制代码

function add_gift_to_cart($act_id, $id, $price)
{
    $sql = "INSERT INTO " . $GLOBALS['ecs']->table('cart') . " (" .
                "user_id, session_id, goods_id, goods_sn, goods_name, market_price, goods_price, ".
                "goods_number, is_real, extension_code, parent_id, is_gift, rec_type, is_shipping ) ".
            "SELECT '$_SESSION[user_id]', '" . SESS_ID . "', goods_id, goods_sn, goods_name,

market_price, ".
                "'$price', 1, is_real, extension_code, 0, '$act_id', '" . CART_GENERAL_GOODS . "' ,

is_shipping " .
            "FROM " . $GLOBALS['ecs']->table('goods') .
            " WHERE goods_id = '$id'";
    $GLOBALS['db']->query($sql);
}

这样就很好的解决了Ecshop系统添加免运费赠品后,购物车变为收取运费的bug这个问题了。

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 解决Pycharm的项目目录突然消失的问题

    今天小编就为大家分享一篇解决Pycharm的项目目录突然消失的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-22
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25