2009-09-09 15 views
12

Tôi đã có những đoạn mã sau đây trên PHP 5.2.4 (không safe_mode) máy chủ Linux:

mkdir($path, 0777, true); 

khi tôi nhập đường dẫn như sau:

'/path/to/create/recur/ively/' 

tất cả các thư mục được tạo ra ngoại trừ người cuối cùng ... khi tôi thêm một thư mục khác như:

'/path/to/create/recur/ively/more/' 

một lần nữa, tất cả những con đường được tạo ra ngoại trừ người cuối cùng ...

đã thử cả hai có và không có đuôi slashes

any1 có thể soi sáng cho tôi ở đây xin vui lòng?

+0

Vui lòng đăng phiên bản PHP chính xác mà bạn đang sử dụng. Ngoài ra, máy chủ của bạn có đang chạy với safe_mode được bật không? –

+0

Mức báo lỗi của bạn là gì? Nếu xảy ra lỗi, E_WARNING sẽ được nâng lên. chế độ an toàn đã tắt, nhưng phiên bản php của bạn có chứa một thứ gì đó giống như suhosin không? Làm thế nào (và từ đâu) bạn đã cài php? Biên dịch từ nguồn "vani" php.net? Thông qua trình quản lý gói phân phối của bạn (cái nào là nó và tên chính xác của gói) là gì? Hàm php_plain_files_mkdir() (chịu trách nhiệm về hàm php mkdir (x, y, true)) đã không thay đổi một chút và tôi chưa tìm thấy một lỗi liên quan tại http://bugs.php.net – VolkerK

+0

Vì vậy, hãy để tôi tổng hợp: câu hỏi là "đệ quy mkdir không hoạt động đúng", và câu trả lời là "oh golly, tôi đã làm sai và xóa thư mục sau này trong mã". Sau đó, tôi thực sự tự hỏi tại sao người dùng này đã có 26 upvotes cho thông tin có giá trị này? Tôi không nghĩ rằng 14 người khác có cùng một vấn đề ... – rob74

Trả lời

14

Ok các giải pháp như sau: không có vấn đề gì.

tôi đã không kiểm tra mã trong sự cô lập, nhưng chỉ thừa nhận đoạn mã sau không được làm bất cứ điều gì để cấu trúc thư mục ...

như tôi phát hiện ra thư mục đã bị xóa sau này bởi mã riêng của mình.

Dù sao, bài học kinh nghiệm ...

8

Cố gắng xóa dấu gạch chéo theo sau khỏi đường dẫn của bạn.

Ít nhất đó là cách nó được sử dụng trong các ví dụ của tài liệu mkdir.

Cá nhân tôi không thể nhớ có vấn đề, nhưng tôi thường không nối thêm dấu gạch chéo, vì vậy hãy thử và thử điều đó.

CẬP NHẬT:

Tôi chỉ cố gắng mã của bạn và nó tạo ra tất cả các thư mục trong đó có người cuối cùng. Tôi đang chạy Mac OS X 10.5. Không biết tại sao nó không làm việc cho bạn :-(

Đó là đoạn code tôi sử dụng:

<?php 
$path = '/Users/andre/test/bla/foo'; 
mkdir($path, 0777, true); 

Xin lỗi, có vẻ như tôi là không có sự giúp đỡ ở đây

+0

Đó là điều đầu tiên tôi làm, nhưng nó vẫn mang lại kết quả tương tự ... – NDM

2

Nếu bạn đã cố gắng tất cả mọi thứ và nó. giữ không làm việc, sau đó thêm một số văn bản vào cuối của con đường như:

$path = '/path/to/create/recur/ively/more/this_wont_be_created_anyway'; 
+0

Đó là cách tôi giải quyết nó trong mã hiện tại ... Nhưng nó không thực sự có ý nghĩa ... – NDM

+0

thats một bẩn làm việc xung quanh và không giúp câu hỏi ... > Có thể any1 enlighten tôi ở đây xin vui lòng? – Gnark

+1

Bạn không bao giờ nên sử dụng mã mà bạn không hiểu. –

1

phiên bản PHP của bạn là gì là safe_mode bật

?

Nếu có, thì có thể bạn đang gặp phải http://bugs.php.net/bug.php?id=43276

+0

5.2.4 mà không safe_mode, vì vậy nó không áp dụng, tôi cũng đã thử và không có dấu gạch chéo để .... – NDM

0

Thư mục trung gian được tạo được đặt dựa trên umask hiện tại. Bạn muốn một cái gì đó như thế này

umask(0777); 
mkdir($path, 0777, true); 
0

Chức năng tạo tất cả thư mục (thư mục) của đường dẫn đã cho. Không cần viết mã tạo từng thư mục (thư mục) của đường dẫn đã cho. nó sẽ tạo tất cả các thư mục (thư mục).

Giống như: Nếu bạn muốn tạo cấu trúc thư mục như
tổ chức/1/users/1/

Vì vậy, bạn chỉ cần gọi hàm này với con đường danh bạ như
$ directories_path = 'tổ chức/1/người dùng/1/';
createUploadDirectories ($ directories_path);

/* 
* Method Name : createUploadDirectories 
* Parameter : null 
* Task : Loading view for create directries for upload 
*/ 

if (! function_exists('createUploadDirectories')){ 
    function createUploadDirectories($upload_path=null){ 
     if($upload_path==null) return false; 
     $upload_directories = explode('/',$upload_path); 
     $createDirectory = array(); 
     foreach ($upload_directories as $upload_directory){ 
      $createDirectory[] = $upload_directory; 
      $createDirectoryPath = implode('/',$createDirectory); 
      if(!is_dir($createDirectoryPath)){ 
       $old = umask(0); 
       mkdir($createDirectoryPath,DIR_WRITE_MODE);// Create the folde if not exist and give permission 
       umask($old); 
      }    
     } 
     return true; 
    } 
} 
0

Bạn sẽ nhận được lỗi này nếu bạn mắc sai lầm ngớ ngẩn tôi đã làm và vượt qua một chuỗi, chứ không phải là số chữ cho chế độ.

mkdir($path, "0777", true); // BAD - only creates /a/b 

mkdir($path, 0777, true); // GOOD - creates /a/b/c/d