php利用mkdir()创建多级目录

本文介绍了如何使用PHP的mkdir()函数创建多级目录,包括mkdir的参数解析、权限设置,以及在PHP5中新增的recursive参数。同时,讨论了在PHP4中创建多级目录的两种自定义方法,一种使用mkdirs()创建父级目录,另一种通过递归调用mkdir自身。文章总结了使用PHP创建目录的各种策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mkdir(path,mode,recursive,context)
第一个参数:必须,代表要创建的多级目录的路径;
第二个参数:可选。规定权限。默认是 0777(允许全局访问)。在windows系统下该参数会被忽略,
mode 参数由四个数字组成:
第一个数字通常是 0
第二个数字规定所有者的权限
第三个数字规定所有者所属的用户组的权限
第四个数字规定其他所有人的权限
可能的值(如需设置多个权限,请对下面的数字进行总计):
1 = 执行权限
2 = 写权限
4 = 读权限
第三个参数:true表示允许创建多级目录。

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

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

<?php
header("Content-type:text/html;charset=utf-8");
//要创建的多级目录 codeit.org.cn
$path="php/php1/php中文";
//判断目录存在否,存在给出提示,不存在则创建目录
if (is_dir($path)){  echo "对不起!目录 " . $path . " 已经存在!";
}else{//第三个参数是“true”表示能创建多级目录,iconv防止中文目录乱码
$res=mkdir(iconv("UTF-8", "GBK", $path),0777,true); 
if ($res){echo "目录 $path 创建成功";
}else{echo "目录 $path 创建失败";}}
?>

注意: 自 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(所有者)。
递归创建多级目录方式有:
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来创建最终的目录了。
好了,以上就是第一种方案。

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

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很巧妙的来创建

### C++ 中 `_mkdir` 创建多级目录的方法与解决方案 在 C++ 编程环境中,标准库并未提供直接用于创建多级目录的功能。然而,可以通过调用特定的操作系统 API 实现这一目的。对于 Windows 平台而言,可以使用 `_mkdir` 函数配合递归逻辑完成多级目录创建[^1]。 下面详细介绍如何通过自定义函数扩展 `_mkdir` 功能以支持多级目录创建: #### 解决方案概述 由于 `_mkdir` 只能创建单层目录,当需要构建深层次嵌套结构时,程序需先解析目标路径中的每一部分,并逐层检测这些中间节点的存在状态。一旦发现某一层缺失,则立即执行创建动作直至整个链条形成为止。 #### 示例代码展示 以下是一段完整的 C++ 程序演示如何借助 `_mkdir` 达成多级目录建立的目标: ```cpp #include <iostream> #include <string> #include <direct.h> // 包含 _mkdir 声明 using namespace std; bool createDirectory(const string& path){ size_t pos = 0; string subPath = ""; while ((pos = path.find_first_of("/\\", pos)) != string::npos) { subPath = path.substr(0, pos); if (_access(subPath.c_str(), 0) != 0){ // 检测子路径是否存在 if(_mkdir(subPath.c_str()) != 0 ){ cerr << "Failed to create directory: "<<subPath<< endl; return false; } } ++pos; // 移动到下一个字符继续寻找分割符 } // 处理最后一部分路径 if (!_access(path.c_str(), 0)){ cout<<"The final directory already exists:"<<path<<endl; }else{ if(_mkdir(path.c_str())!=0){ cerr << "Failed to create the last part of directory:" << path << endl; return false; } } return true; } int main(){ string dirName="test/multi/level/dir"; if(createDirectory(dirName)) cout << "All directories created successfully." << endl; else cout << "Some errors occurred during creation process." << endl; return 0; } ``` 上述代码实现了如下功能: - 利用 `find_first_of()` 查找路径字符串中的每一个分隔符位置。 - 将每一段提取出来作为临时变量存储起来以便后续判断和操作。 - 使用 `_access()` 测试对应阶段性的文件夹是否已经存在。 - 如果不存在则调用 `_mkdir()` 进行实际的新建工作直到整条链路全部贯通结束[^1]^。 注意事项: 尽管上面例子适用于Windows平台,但对于跨平台应用来说,推荐采用Boost.Filesystem或其他第三方类库来简化此类复杂度较高的任务管理过程[^2]. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值