Как проверить, существует ли каталог? "is_dir", "file_exists" или оба?
Я хочу создать каталог, если он еще не существует.
Достаточно ли для этого использования is_dir
?
if ( !is_dir( $dir ) ) {
mkdir( $dir );
}
Или я должен объединить is_dir
с file_exists
?
if ( !file_exists( $dir ) && !is_dir( $dir ) ) {
mkdir( $dir );
}
Ответы
Ответ 1
Оба будут возвращать true в Unix-системах - в Unix все это файл, включая каталоги. Но чтобы проверить, взято ли это имя, вы должны проверить оба. Может существовать обычный файл с именем "foo", который помешает вам создать имя каталога "foo".
Ответ 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.";
}
Ответ 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 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 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
Ответ 4
Второй вариант в вопросе post не работает, потому что, если у вас уже есть файл с тем же именем, но он не является каталогом, !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 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);
}
Ответ 6
$save_folder = "some/path/" . date('dmy');
if (!file_exists($save_folder)) {
mkdir($save_folder, 0777);
}
Ответ 7
добавить истину после 0777
<?php
$dirname = "small";
$filename = "upload/".$dirname."/";
if (!is_dir($filename )) {
mkdir("upload/" . $dirname, 0777, true);
echo "The directory $dirname was successfully created.";
exit;
} else {
echo "The directory $dirname exists.";
}
?>
Ответ 8
Ну, вместо проверки обоих вы можете сделать 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();
Ответ 9
У меня было такое же сомнение, но см. документ PHP:
https://www.php.net/manual/en/function.file-exists.php
https://www.php.net/manual/en/function.is-dir.php
Вы увидите, что is-dir обладает обоими свойствами.
Возвращаемые значения is_dir Возвращает TRUE, если имя файла существует и является каталогом, иначе FALSE.