为此目的使用
is_dir
是否足够?if ( !is_dir( $dir ) ) {
mkdir( $dir );
}
还是应该将
is_dir
与file_exists
结合起来?if ( !file_exists( $dir ) && !is_dir( $dir ) ) {
mkdir( $dir );
}
#1 楼
两者在Unix系统上都将返回true-在Unix中,所有内容都是文件,包括目录。但是要测试该名称是否被采用,您应该同时检查两者。可能会有一个名为“ foo”的常规文件,这将阻止您创建目录名称“ foo”。评论
不要忘记检查is_writable是否也
–德鲁丁
2011-3-24在21:46
@Drewdin您想检查父项是否为is_writable,不是吗?
–马修·沙利(Matthew Scharley)
2011-3-24在22:36
#2 楼
$dirname = $_POST["search"];
$filename = "/folder/" . $dirname . "/";
if (!file_exists($filename)) {
mkdir("folder/" . $dirname, 0777);
echo "The directory $dirname was successfully created.";
exit;
} else {
echo "The directory $dirname exists.";
}
评论
回声说的很……
–凯
2011年6月9日在3:44
考虑到它需要后期输入并按原样使用,加上0777 dir,根本就不那么安全; P
–sever
13年8月20日在16:45
更严重的是,可以清理$ dirname并将权限设置为0755。此外,还添加了一些.htaccess指令。 OWASP上还有一些其他建议:owasp.org
–詹姆斯P.
13年8月24日在5:21
#以下指令强制内容类型application / octet-stream#,并强制浏览器显示非图像文件的下载对话框。 #这样可防止在网站上下文中执行脚本文件:#ForceType应用程序/八位字节流头集Content-Disposition附件
–詹姆斯P.
13年8月24日在5:23
使用mkdir时-为什么不只传递'$ filename'?
– Howdy_McGee
2014年1月14日19:06
#3 楼
我认为realpath()可能是验证路径是否存在的最佳方法http://www.php.net/realpath
这里是一个示例函数:
<?php
/**
* Checks if a folder exist and return canonicalized absolute pathname (long version)
* @param string $folder the path being checked.
* @return mixed returns the canonicalized absolute pathname on success otherwise FALSE is returned
*/
function folder_exist($folder)
{
// Get canonicalized absolute pathname
$path = realpath($folder);
// If it exist, check if it's a directory
if($path !== false AND is_dir($path))
{
// Return canonicalized absolute pathname
return $path;
}
// Path/folder does not exist
return false;
}
同一功能的简短版本
<?php
/**
* Checks if a folder exist and return canonicalized absolute pathname (sort version)
* @param string $folder the path being checked.
* @return mixed returns the canonicalized absolute pathname on success otherwise FALSE is returned
*/
function folder_exist($folder)
{
// Get canonicalized absolute pathname
$path = realpath($folder);
// If it exist, check if it's a directory
return ($path !== false AND is_dir($path)) ? $path : false;
}
输出示例
<?php
/** CASE 1 **/
$input = '/some/path/which/does/not/exist';
var_dump($input); // string(31) "/some/path/which/does/not/exist"
$output = folder_exist($input);
var_dump($output); // bool(false)
/** CASE 2 **/
$input = '/home';
var_dump($input);
$output = folder_exist($input); // string(5) "/home"
var_dump($output); // string(5) "/home"
/** CASE 3 **/
$input = '/home/..';
var_dump($input); // string(8) "/home/.."
$output = folder_exist($input);
var_dump($output); // string(1) "/"
用法
<?php
$folder = '/foo/bar';
if(FALSE !== ($path = folder_exist($folder)))
{
die('Folder ' . $path . ' already exist');
}
mkdir($folder);
// Continue do stuff
评论
对于任何遇到这种情况的人,我相信realpath在运行时会缓存文件夹,因此,如果运行一次,则该文件夹将在此之后被删除,如果再次运行,它可能不会返回false。
–杰斯
2015年11月29日,下午3:12
但是file_exists也是如此
– Sebas
16年2月10日在4:12
#4 楼
有问题的帖子的第二个变种不好,因为,如果您已经有相同名称的文件,但它不是目录,则!file_exists($dir)
将返回false
,将不会创建文件夹,因此将发生错误"failed to open stream: No such file or directory"
。在Windows中,“文件”和“文件夹”类型之间存在差异,因此需要同时使用file_exists()
和is_dir()
,例如:if (file_exists('file')) {
if (!is_dir('file')) { //if file is already present, but it's not a dir
//do something with file - delete, rename, etc.
unlink('file'); //for example
mkdir('file', NEEDED_ACCESS_LEVEL);
}
} else { //no file exists with this name
mkdir('file', NEEDED_ACCESS_LEVEL);
}
#5 楼
$year = date("Y");
$month = date("m");
$filename = "../".$year;
$filename2 = "../".$year."/".$month;
if(file_exists($filename)){
if(file_exists($filename2)==false){
mkdir($filename2,0777);
}
}else{
mkdir($filename,0777);
}
评论
您可以检查完整路径,如果不存在,请使用mkdir递归创建:if(!file_exists($ filename2)){mkdir($ filename2,0777,true);此外,如果$ filename不存在,您的代码将永远不会创建完整路径...
– Niels R.
2013年12月30日18:38
这个仅代码的答案似乎偏离了问题的范围(这个答案不只是重复早先已经说过的内容吗?),并且应该包括一些能解释该片段的简单说法。
– mickmackusa
20-10-12在23:05
#6 楼
$save_folder = "some/path/" . date('dmy');
if (!file_exists($save_folder)) {
mkdir($save_folder, 0777);
}
评论
设置chmod 777绝不是一个好主意。 755就足够了。
– Oldskool
15年6月11日在8:22
这篇文章缺少教育解释。
– mickmackusa
20-10-12在23:03
#7 楼
这是一个古老但仍是话题性的问题。只需使用is_dir()
或file_exists()
函数测试被测目录中是否存在.
或..
文件。每个目录必须包含以下文件:is_dir("path_to_directory/.");
#8 楼
我也有同样的疑问,但请参阅PHP文档:https://www.php.net/manual/en/function.file-exists.php
https://www.php.net /manual/zh-CN/function.is-dir.php
您将看到
is_dir()
具有这两个属性。返回值is_dir
如果文件名存在并且是目录,则返回TRUE。 ,否则为FALSE。
#9 楼
好吧,而不是同时检查两者,您可以执行if(stream_resolve_include_path($folder)!==false)
。它比较慢,但是可以一枪杀死两只鸟。另一种选择是简单地忽略
E_WARNING
,而不使用@mkdir(...);
(因为这将简单地放弃所有可能的警告,而不仅仅是目录已经存在) ,但要先注册一个特定的错误处理程序:namespace com\stackoverflow;
set_error_handler(function($errno, $errm) {
if (strpos($errm,"exists") === false) throw new \Exception($errm); //or better: create your own FolderCreationException class
});
mkdir($folder);
/* possibly more mkdir instructions, which is when this becomes useful */
restore_error_handler();
#10 楼
这就是我的做法if(is_dir("./folder/test"))
{
echo "Exist";
}else{
echo "Not exist";
}
评论
当回答一个旧问题时,如果您包含一些上下文来解释您的答案如何帮助您的答案,则对其他StackOverflow用户将更加有用,尤其是对于已经接受了答案的问题。请参阅:我如何写一个好的答案。
–大卫·巴克
19年11月30日在20:26
#11 楼
检查路径是否为目录的一种方法可以是:function isDirectory($path) {
$all = @scandir($path);
return $all !== false;
}
注意:对于不存在的路径,它也会返回false,但是可以正常工作对于UNIX / Windows
评论
布尔运算符OR应该为AND,在PHP中,其写为&&@IvoRenkema PHP还支持or / and和|| / &&。
运算符&&在这里没有用,因为如果文件不存在(!file_exists($ dir)== true),请确保它不是目录。如果文件存在,则不会检查!is_dir($ dir),因为!file_exists($ dir)将返回false且&&运算符短路。
我认为运算符应为OR。
与&&一起使用对我来说很完美