I've mengalami beberapa kasus dengan menginstall WordPress dengan Bluehost di mana saya've ditemui kesalahan dengan tema WordPress karena upload folder wp-content/uploads
tidak hadir.
Rupanya Bluehost cPanel WP installer tidak membuat folder ini, meskipun HostGator tidak.
Jadi saya perlu menambahkan kode untuk tema saya yang memeriksa folder dan menciptakan hal sebaliknya.
Coba ini:
if (!file_exists('path/to/directory')) {
mkdir('path/to/directory', 0777, true);
}
Perhatikan bahwa 0777
sudah default mode untuk direktori dan masih dapat dimodifikasi oleh arus umask.
Berikut ini adalah potongan yang hilang. Anda harus lulus 'rekursif' bendera sebagai argumen ketiga (boolean true) di mkdir panggilan seperti ini:
mkdir('path/to/directory', 0755, true);
Sesuatu yang sedikit lebih universal karena ini muncul di google. Sementara rincian lebih spesifik, judul pertanyaan ini lebih universal.
/**
* recursively create a long directory path
*/
function createPath($path) {
if (is_dir($path)) return true;
$prev_path = substr($path, 0, strrpos($path, '/', -2) + 1 );
$return = createPath($prev_path);
return ($return && is_writable($prev_path)) ? mkdir($path) : false;
}
Ini akan mengambil jalan, mungkin dengan rantai panjang tidak diciptakan direktori, dan terus berjalan hingga satu direktori hingga sampai ke direktori yang sudah ada. Kemudian akan mencoba untuk membuat direktori dalam direktori tersebut, dan terus berlanjut sampai's dibuat semua direktori. Mengembalikan true jika berhasil.
Dapat ditingkatkan dengan memberikan tingkat berhenti jadi itu hanya gagal jika melampaui pengguna folder atau sesuatu dan dengan izin.
Bagaimana dengan fungsi pembantu seperti ini:
function makeDir($path)
{
$ret = mkdir($path); // use @mkdir if you want to suppress warnings/errors
return $ret === true || is_dir($path);
}
Itu akan mengembalikan true
jika direktori yang telah berhasil dibuat atau yang sudah ada, dan palsu
jika direktori tidak't akan dibuat.
A baik alternatif ini (seharusnya't memberikan peringatan apapun):
function makeDir($path)
{
return is_dir($path) || mkdir($path);
}
Dalam WordPress ada's juga sangat berguna fungsi wp_mkdir_p yang akan secara rekursif membuat struktur direktori.
Sumber referensi:-
function wp_mkdir_p( $target ) {
$wrapper = null;
// strip the protocol
if( wp_is_stream( $target ) ) {
list( $wrapper, $target ) = explode( '://', $target, 2 );
}
// from php.net/mkdir user contributed notes
$target = str_replace( '//', '/', $target );
// put the wrapper back on the target
if( $wrapper !== null ) {
$target = $wrapper . '://' . $target;
}
// safe mode fails with a trailing slash under certain PHP versions.
$target = rtrim($target, '/'); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.
if ( empty($target) )
$target = '/';
if ( file_exists( $target ) )
return @is_dir( $target );
// We need to find the permissions of the parent folder that exists and inherit that.
$target_parent = dirname( $target );
while ( '.' != $target_parent && ! is_dir( $target_parent ) ) {
$target_parent = dirname( $target_parent );
}
// Get the permission bits.
if ( $stat = @stat( $target_parent ) ) {
$dir_perms = $stat['mode'] & 0007777;
} else {
$dir_perms = 0777;
}
if ( @mkdir( $target, $dir_perms, true ) ) {
// If a umask is set that modifies $dir_perms, we'll have to re-set the $dir_perms correctly with chmod()
if ( $dir_perms != ( $dir_perms & ~umask() ) ) {
$folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );
for ( $i = 1; $i <= count( $folder_parts ); $i++ ) {
@chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );
}
}
return true;
}
return false;
}
Saya membutuhkan hal yang sama untuk login situs. Saya perlu untuk membuat sebuah direktori dengan dua variabel. The $directory adalah folder utama di mana saya ingin membuat sub-folder dengan pengguna nomor lisensi.
include_once("../include/session.php");
$lnum = $session->lnum; //Users license number from sessions
$directory = uploaded_labels; // Name of directory that folder is being created in
if (!file_exists($directory."/".$lnum)) {
mkdir($directory."/".$lnum, 0777, true);
}
Jika anda ingin menghindari file_exists
VS is_dir
masalah, saya akan menyarankan anda untuk melihat di sini
Saya mencoba ini dan itu hanya menciptakan direktori jika direktori tidak ada. Tidak peduli itu ada file dengan nama itu.
/* Creates the directory if it does not exist */
$path_to_directory = 'path/to/directory';
if (!file_exists($path_to_directory) && !is_dir($path_to_directory)) {
mkdir($path_to_directory, 0777, true);
}
Mempertimbangkan pertanyaan's lingkungan.
Dan mengutip dari: http://php.net/manual/en/function.mkdir.php
bool mkdir ( string $path [, int $mode = 0777 [, bool $rekursif = PALSU [, sumber daya $konteks ]]] )
Dapat dikatakan bahwa satu-satunya parameter yang dibutuhkan adalah $path
!
jadi, Kita hanya bisa kode:
<?php
error_reporting(0);
if(!mkdir('wp-content/uploads')){
// todo
}
?>
Kami don't harus melewati setiap parameter atau memeriksa jika folder yang ada atau bahkan melewati mode parameter kecuali jika diperlukan; untuk alasan berikut:
mode
diabaikan pada Windows Hosting menjalankan PHP.mkdir perintah
telah membangun checker jika folder yang ada, sehingga kita perlu memeriksa kembali hanya Benar|Salah ; dan tidak error, itu hanya peringatan, dan Peringatan dinonaktifkan di server hosting secara default.Ini hanya cara lain untuk melihat ke dalam pertanyaan dan tidak mengklaim lebih baik atau solusi yang paling optimal.
Diuji pada PHP7, Produksi, Server, Linux
Kita harus selalu modularise kode kita dan I've ditulis sama cek di bawah ini... Kita periksa dulu direktori, jika direktori tidak ada kita membuat direktori.
$boolDirPresents = $this->CheckDir($DirectoryName);
if (!$boolDirPresents) {
$boolCreateDirectory = $this->CreateDirectory($DirectoryName);
if ($boolCreateDirectory) {
echo "Created successfully";
}
}
function CheckDir($DirName) {
if (file_exists($DirName)) {
echo "Dir Exists<br>";
return true;
} else {
echo "Dir Not Absent<br>";
return false;
}
}
function CreateDirectory($DirName) {
if (mkdir($DirName, 0777)) {
return true;
} else {
return false;
}
}
Anda harus terlebih dahulu memeriksa apakah ada direktori file_exists('path_to_directory')
Kemudian menggunakan mkdir(path_to_directory)
untuk membuat direktori
mkdir( string $pathname [, int $mode = 0777 [, bool $recursive = FALSE [, resource $context ]]] ) : bool
Lebih lanjut tentang mkdir() di sini
Penuh kode berikut:
$structure = './depth1/depth2/depth3/';
if (!file_exists($structure)) {
mkdir($structure);
}