2010-02-20 42 views
469

Tôi đã gặp phải một vài trường hợp với cài đặt WordPress với Bluehost, nơi tôi gặp lỗi với chủ đề WordPress của mình vì thư mục tải lên wp-content/uploads không có mặt.Tạo một thư mục nếu nó chưa tồn tại

Dường như trình cài đặt Bluehost cPanel WP không tạo thư mục này, mặc dù HostGator thực hiện.

Vì vậy, tôi cần thêm mã vào chủ đề của mình để kiểm tra thư mục và tạo nó theo cách khác.

Trả lời

910

Hãy thử điều này:

if (!file_exists('path/to/directory')) { 
    mkdir('path/to/directory', 0777, true); 
} 

Lưu ý rằng 0777 đã là chế độ mặc định cho thư mục và vẫn có thể được sửa đổi bởi umask hiện hành.

+7

Bạn bỏ lỡ cờ 'đệ quy' - xem câu trả lời Satish của. –

+83

is_dir() nhanh hơn một chút so với tệp_exists() –

+26

@YuryPliashkou Có thể, nhưng nó không hoạt động nếu đã có * tệp * với tên đó. – Gumbo

44

gì về một hàm helper như thế này:

function makeDir($path) 
{ 
    $ret = mkdir($path); // use @mkdir if you want to suppress warnings/errors 
    return $ret === true || is_dir($path); 
} 

Nó sẽ trở lại true nếu thư mục đã được tạo thành công hoặc đã tồn tại, và false nếu thư mục không thể được tạo ra.

Một lựa chọn tốt hơn là thế này (không nên đưa ra bất cứ cảnh báo):

function makeDir($path) 
{ 
    return is_dir($path) || mkdir($path); 
} 
+4

Nếu bạn loại bỏ '@' và thay thế nó bằng một kiểm tra 'is_dir' thích hợp, upvote của tôi là của bạn :) Điểm thưởng để kiểm tra xem thư mục cha' is_writable() 'có chức năng trợ giúp kín nước hay không. –

+0

Sử dụng @ để chặn các lỗi là một lần truy cập hiệu suất. Tốt hơn nên kiểm tra xem nó đã không tồn tại như Gumbo – Simon

+0

Được rồi, đã loại bỏ lỗi triệt tiêu. – AndiDog

56

Something phổ quát hơn một chút vì đây đi lên trên google. Mặc dù chi tiết cụ thể hơn, nhưng tiêu đề của câu hỏi này phổ biến hơn.

/** 
* 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; 
} 

Điều này sẽ có đường dẫn, có thể với một chuỗi dài các thư mục chưa được xử lý và tiếp tục mở một thư mục cho đến khi thư mục hiện có. Sau đó, nó sẽ cố gắng để tạo ra các thư mục tiếp theo trong thư mục đó, và tiếp tục cho đến khi nó được tạo ra tất cả các thư mục. Nó trả về true nếu thành công.

Có thể được cải thiện bằng cách cung cấp một mức dừng để nó chỉ thất bại nếu nó vượt ra ngoài thư mục người dùng hoặc một cái gì đó và bằng cách bao gồm quyền.

+0

vì một số lý do mã này trả về "trang không tìm thấy", mặc dù các câu trả lời khác hoạt động ... – Armand

+0

@phazei Tôi nhận được cuộc gọi đến chức năng không xác định vì dòng $ return = createPath ($ prev_path); – Battousai

+0

Thanks @phazei :) – anhlee

98

Đây là phần còn thiếu. Bạn cần phải vượt qua 'đệ quy' cờ như là đối số thứ ba (boolean true) trong cuộc gọi mkdir như thế này:

mkdir('path/to/directory', 0755, true); 
+4

cờ 'đệ quy' là đối số thứ 3 boolean 'true' – ahnbizcad

-1
if (!is_dir('path_directory')) { 
    @mkdir('path_directory'); 
} 
+2

Lỗi triệt tiêu? Tại sao? – canadiancreed

+3

Với việc loại bỏ lỗi, không cần kiểm tra thư mục đó có tồn tại không? – neoascetic

+1

tốt hơn là xử lý lỗi hơn là loại bỏ chúng. Nếu điều này không thành công, bạn sẽ không bao giờ biết tại sao từ điều này, và sẽ phải nghiên cứu nó –

3

tôi cần những điều tương tự cho một trang web đăng nhập. Tôi cần tạo một thư mục có hai biến. Thư mục $ là thư mục chính nơi tôi muốn tạo một thư mục con khác với số giấy phép người dùng.

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); 
} 
6

Trong WordPress cũng có chức năng rất tiện dụng wp_mkdir_p sẽ đệ quy tạo cấu trúc thư mục.

Nguồn tham khảo: -

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; 
} 
17

Đệ quy tạo đường dẫn thư mục:

function makedirs($dirpath, $mode=0777) { 
    return is_dir($dirpath) || mkdir($dirpath, $mode, true); 
} 

Lấy cảm hứng từ Python của os.makedirs()

1

Đây là giải pháp nhất để cập nhật lên mà không ức chế lỗi:

if (!is_dir('path/to/directory')) { 
    mkdir('path/to/directory'); 
} 
0

Bạn có thể thử thêm:

$dirpath = "path/to/dir"; 
$mode = "0777"; 
is_dir($dirpath) || mkdir($dirpath, $mode, true); 
13

nhanh hơn cách để tạo thư mục:

if (!is_dir('path/to/directory')) { 
    mkdir('path/to/directory', 0777, true); 
} 
Các vấn đề liên quan