PHP递归创建多级目录(一道面试题的解题过程)
今天看到一道面试题,要写出一个可以创建多级目录的函数:
我的第一个感觉就是用递归创建,具体思路如下:
function Directory($dir){
if(is_dir($dir) || @mkdir($dir,0777)){ //查看目录是否已经存在或尝试创建,加一个@抑制符号是因为第一次创建失败,会报一个“父目录不存在”的警告。
echo $dir."创建成功<br>"; //输出创建成功的目录
}else{
$dirArr=explode('/',$dir); //当子目录没创建成功时,试图创建父目录,用explode()函数以'/'分隔符切割成一个数组
array_pop($dirArr); //将数组中的最后一项(即子目录)弹出来,
$newDir=implode('/',$dirArr); //重新组合成一个文件夹字符串
Directory($newDir); //试图创建父目录
if(@mkdir($dir,0777)){
echo $dir."创建成功<br>";
} //再次试图创建子目录,成功输出目录名
}
}
Directory("A/B/C/D/E/F");
输出结果如图:
但是可以看得出来,写得也太麻烦了,在手册里翻看文件函数,看到一个dirname()函数,其原型如下:
string dirname ( string $path )
给出一个包含有指向一个文件的全路径的字符串,本函数返回去掉文件名后的目录名。
在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其它环境下是斜线(/)。
可以稍稍地优化一下:
function Directory($dir){
if(is_dir($dir) || @mkdir($dir,0777)){
echo $dir."创建成功<br>";
}else{
Directory(dirname($dir));
if(@mkdir($dir,0777)){
echo $dir."创建成功<br>";
}
}
}
效果一样。
之后我在在网上搜一下答案,找到一个异常精辟的:
function Directory( $dir ){
return is_dir ( $dir ) or Directory(dirname( $dir )) and mkdir ( $dir , 0777);
}
现在来解释一下整个函数:
先介绍一下PHP中逻辑运算符的优先级顺序:&& > || > and > or,即符号型>字母型,AND型>OR型,所以函数体可以看成:
is_dir ( $dir ) or (Directory(dirname( $dir )) and mkdir ( $dir , 0777));
先判断目标目录是否存在,若存在,依or的短路特性,后面的整体被短路,跳过执行;若目标目录不存在,则执行后面的函数体:
Directory(dirname( $dir )) and mkdir ( $dir , 0777)
我考虑了一下先进行递归的用意:先执行递归,意在确认其父目录(dirname($dir))都已经创建完毕,使后面的mkdir()函数不会创建子目录时找不到父目录发出警告。
进入递归深处后,确认最深处的根目录存在后,从根目录向下依次创建目录。
最后,建议要找工作的亲们,去网上找些大公司面试题做一下,毕竟他们考得较为综合较深,在学习知识的时候,也刷一下题,另外也一定要做一下,因为很容易眼高手低,一开始的函数,我优化了好几遍才能正常使用。
以后我也会再找些有意思的面试题跟大家分享。
如果您觉得本博文对您有帮助,您可以推荐或关注我,如果您有什么问题,可以在下方留言讨论,谢谢。
PHP递归创建多级目录(一道面试题的解题过程)的更多相关文章
- php使用递归创建多级目录
<?php header('Content-type:text/html;charset=utf8'); echo "Loading time:".date('Y-m-d H ...
- PHP判断文件夹是否存在和创建文件夹的方法(递归创建多级目录)
在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其实不是那样,单个的MKDIR只能创建一级目录,对于多级的就不行了,那如何用mkdir来创建呢?先我抄一段 ...
- PHP递归创建多级目录(一道面试题的解题过程)(转)
今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @m ...
- node.js 递归创建多级目录
fs.mkdir只能创建一级目录,所以我们可以自定义一个mkdirs函数,利用递归和回调来实现创建多级目录. function mkdirs(dirname, callback) { //检测目录是否 ...
- 根据CreateDirectory递归创建多级目录
分为MFC下的和非MFC下的两种,MFC路径是CString类型的,非MFC的路径是wstring类型的. 下面是MFC下的创建目录: void __fastcall RecursiveDirecto ...
- PHP中使用mkdir创建多级目录的方法
function mkdirs($dir) { if(!is_dir($dir)) { if(!mkdirs(dirname($dir))){ return false; ...
- php创建多级目录的两种方法
1.使用递归的思想 function mkdirs_2($path){ if(!is_dir($path)){ mkdirs_2(dirname($path)); if(!mkdir($path, 0 ...
- php mkdir 创建多级目录实例代码
先介绍一下 mkdir() 这个函数 mkdir($path,0777,true); 第一个参数:必须,代表要创建的多级目录的路径. 第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访问 ...
- 运用php函数mkdir创建多级目录
php默认的mkdir一次只能创建一层目录,如果在当前目录下创建一个div/css/layout 的目录就需要逐层逐层的先创建div,再创建div/css 再创建 div/css/layout,然而我 ...
随机推荐
- 价值100W的经验分享: 基于JSPatch的iOS应用线上Bug的即时修复方案,附源码.
限于iOS AppStore的审核机制,一些新的功能的添加或者bug的修复,想做些节日专属的活动等,几乎都是不太可能的.从已有的经验来看,也是有了一些比较常用的解决方案.本文先是会简单说明对比大部分方 ...
- Sql Server来龙去脉系列之一 目录篇
从工作一直到现在都没怎么花功夫深入学习下Sql Server数据库,在使用Sql Server时90%的时间基本上都是在接触T-SQL,所以数据库这块基本上属于菜鸟级别.至于数据库的底层框架以及运行机 ...
- Node.js爬虫数据抓取乱码问题总结
一.非UTF-8页面处理 1.背景 windows-1251编码 比如俄语网站:https://vk.com/cciinniikk 可耻地发现是这种编码 所有这里主要说的是 Windows-1251( ...
- MVC显示详细记录Without Entity Framework
看过此篇<MVC用非Entity Framework将数据显示于视图(二)>http://www.cnblogs.com/insus/p/3364482.html 了解到把数据库中数据表的 ...
- Azure开发者任务之三:理解Azure应用程序(上)
作为Windows Azure的托管服务被设计和开发的应用程序由这两部分组成: 1,托管代码 2,XML配置文件 托管代码对应不同的角色 XML文件对应不同的配置设置 我们可以看一下下面这张图,它详细 ...
- Python入门版
一.前言 陆陆续续学习Python已经近半年时间了,感觉到Python的强大之外,也深刻体会到Python的艺术.哲学.曾经的约定,到现在才兑现,其中不乏有很多懈怠,狼狈. Python入门关于Pyt ...
- 合并多个dll为一个dll
有时候自己写个小工具或者其它啥的物件,引用了好多第三方控件,如log4net,aspnetpager啥的,发布出去让别人看到自己竟然用了这么多的第三方DLL, 会对自己的能力产生怀疑,那有什么办法可以 ...
- Xcode配置libdc1394
libdc1394是一个开源库,提供了一个Mac下完整的1394相机编程接口,这篇文章将介绍Xcode如何配置该库. 步骤: 1.下载libdc1394的源码,并解压 http://damien.do ...
- 程序设计模式 —— State 状态模式
我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...
- lnmp+phpmyadmin配置与出现问题
本博客归moka同学(新浪微博:moka同学)本人亲自整理,如有使用,请加链接注明出处. lnmp 安装完全后,配置phpmyadmin .其访问方式为 http://202.18.400.379/p ...