PHP mkdir创建文件夹实现方法解析


Posted in PHP onNovember 13, 2020

在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其它不是那样,单个的MKDIR只能创建一级目录,对于多级的就不行了,那如何用mkdir来创建呢?先我抄一段手册上的有关mkdir的描述,如下:

说明

bool mkdir ( string pathname [, int mode [, bool recursive [, resource context]]] )

尝试新建一个由 pathname 指定的目录。

注意也许想用八进制数指定模式,也就是说该数应以零打头。模式也会被当前的 umask 修改,可以用 umask() 来改变。

注意: mode 在 Windows 下被忽略。自 PHP 4.2.0 起成为可选项。

默认的 mode 是 0777,意味着最大可能的访问权。有关 mode 的更多信息请阅读 chmod() 页面。

例 1. mkdir() 例子

<?php
mkdir("/path/to/my/dir", 0700);
?>

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

例 2. mkdir() 例子

$dir = iconv("UTF-8", "GBK", "public/log");
if (!file_exists($dir)){
	mkdir ($dir,0777,true);
	echo '创建文件夹log成功';
} else {
	echo '需创建的文件夹log已经存在';
}

iconv方法是为了防止中文乱码,保证可以创建识别中文目录,不用iconv方法格式的话,将无法创建中文目录

mkdir方法的第一个参数是要创建的目录路径,第二个参数是指创建目录的权限,在windows系统下该参数会被忽略,第三个参数是指是否创建多级目录,默认为false
参考链接:https://www.cnblogs.com/modou/p/5991365.html

注意: 自 PHP 5.0.0 rmdir() 也可用于某些 URL 封装协议。参见附录 N 的列表看看 rmdir() 支持哪些 URL 封装协议。

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

注意: recursive 参数是 PHP 5.0.0 添加的。

注意: 当安全模式被激活时,PHP 将检查被操作的目录是否和正在执行的脚本有相同的 UID(所有者)。

以上是PHP5手册上的描述信息,即你可以这样:mkdir('./test',0777)就能创建一个文件夹了。但是如何递归创建多级目录呢?
其方式有:

1 PHP5 下创建目录函数 mkdir 增加了一个新的参数 recursive ,通过设置 recursive 为 true 可以实现递归创建目录的目的,但是对PHP4就不行了。

2 自己写一个递归创建多级目录。

这里,我对第二种方式作一点说明,也有两种方式,如下:

第一种(用mkdirs来产生多级父级)

function mkdirs($dir, $mode = 0777)
{
if (is_dir($dir) || @mkdir($dir, $mode)) return TRUE;
if (!mkdirs(dirname($dir), $mode)) return FALSE;
return @mkdir($dir, $mode);
}

说明:

1 首先 简单说一下mkdir()与mkdirs()的区别,以及,is_dir和dirname():

mkdir() 只能在已经存在的目录中创建创建文件夹(即父级必须有才行)。

mkdirs() 可以在不存在的目录中创建文件夹。诸如:a//b,既可以创建多级目录。

dirname() 是返回路径中的目录部分。

is_dir() 用于判断给出的文件名是否是一个有效的目录

2 大致流程为:

(1) 先用is_dir判断是否已是一个文件夹,如果是则返回TRUE。如没有(或者不是文件夹),则试着创建它,当然有可以父级不存在,那mkdir直接就创不成功,但也为不报错,所以就用@来抑止报非致命错误。

(2)如果传参数都不满足条件,那么就进入第二个if语句,先是取得路径中的目录部分,当然有可能是不存在的多级父级,所以用了mkdirs()来先创建父级,如果成功(不成功返回FALSE),那么再用mkdir来创建最终的目录了。
好了,以上就是第一种方案。

第二种(说明:此方案是相当的精简,那是相当的不错的方案,推荐使用它)

function create_folders($dir){
return is_dir($dir) or (create_folders(dirname($dir)) and mkdir($dir, 0777));
}

说明: 1 大致流程: 得到路径后,先判断是否已是一个有效的文件目录,如是则返回,结束程序。如果不是,(由于这里用了OR作先择性的条件,即只要满足其中一个条件就行),则递归再调用自身,并且传入的路径中,少一级目录。这样来先回到上级有的父级目录中,再用mkdir来创建下一级的。

好了,以上就是用PHP来创建文件夹(以及多级文件夹)的方法。_

总结:

1 用PHP5中自带的mkdir 中的一个新的参数 recursive ,通过设置 recursive 为 true 可以实现递归创建目录的目的,但是对PHP4就不行了。

2 自己写的方法中,用mkdirs来创建多级父级目录方式

3 仍然用mkdir很巧妙的来创建

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Windows下的PHP5.0详解
Nov 18 PHP
用mysql触发器自动更新memcache的实现代码
Oct 11 PHP
在命令行下运行PHP脚本[带参数]的方法
Jan 22 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 PHP
PHP把数字转成人民币大写的函数分享
Jun 30 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
Yii2框架BootStrap样式的深入理解
Nov 07 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 PHP
laravel 解决强制跳转 https的问题
Oct 22 PHP
PHP接入支付宝接口失效流程详解
Nov 10 #PHP
基于PHP实现用户在线状态检测
Nov 10 #PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 #PHP
PHP safe_mode开启对于PHP系统函数有什么影响
Nov 10 #PHP
通过PHP实现用户注册后邮箱验证激活
Nov 10 #PHP
PHP中的异常处理机制深入讲解
Nov 10 #PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 #PHP
You might like
星际争霸中的对战模式介绍
2020/03/04 星际争霸
example2.php
2006/10/09 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
菜单效果
2006/10/14 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
2014/05/27 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
React Router基础使用
2017/01/17 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
基于Python函数和变量名解析
2019/07/19 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
公司营业员的自我评价
2014/03/04 职场文书
中秋节主持词
2014/04/02 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
家长给老师的感谢信
2015/01/20 职场文书
Django如何与Ajax交互
2021/04/29 Python
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
ICOM R71E和R72E图文对比解说
2022/04/07 无线电