2009-09-09 12 views
12

Ho il seguente pezzo di codice su un PHP 5.2.4 (senza safe_mode) server Linux:

mkdir($path, 0777, true); 

quando entro in un percorso simile:

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

tutte le directory sono create, tranne che per l'ultimo ... quando aggiungo un'altra directory come:

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

ancora una volta, tutti i percorsi sono creati, tranne che per l'ultimo ...

hanno provato sia con che senza trailing slash

Può any1 illuminarmi qui per favore?

+0

Inserisci la versione esatta di PHP che stai utilizzando. Inoltre, il tuo host è in esecuzione con safe_mode abilitato? –

+0

Qual è il tuo livello error_reporting? Se qualcosa va storto, viene generato E_WARNING. la modalità sicura è disattivata, ma la tua versione di php contiene qualcosa come suhosin? Come (e da dove) hai installato php? Compilato da fonti "php.net" di vaniglia? Attraverso il gestore del pacchetto della tua distribuzione (quale è e qual è il nome esatto del pacchetto)? La funzione php_plain_files_mkdir() (responsabile della funzione php mkdir (x, y, true)) non è cambiata da un po 'di tempo e non ho trovato un bug correlato su http://bugs.php.net – VolkerK

+0

Quindi, lascia mi riassumo: la domanda è "mkdir ricorsivo non funziona correttamente", e la risposta è "oh golosamente, ho fatto un errore e cancellato la directory più avanti nel codice". Allora mi chiedo davvero perché questo utente ha 26 voti positivi per questa preziosa informazione? Non credo che altre 14 persone abbiano avuto lo stesso problema ... – rob74

risposta

14

Ok le soluzioni sono le seguenti: non ci sono stati problemi.

non ho la prova il codice in modo isolato, ma solo assunto il seguente codice non stava facendo nulla per la struttura delle directory ...

come ho scoperto la directory ottenuto cancellato in seguito dal codice stesso.

In ogni caso, imparato la lezione ...

8

Provare a rimuovere la barra finale dal percorso.

Almeno questo è il modo in cui viene utilizzato negli esempi della documentazione mkdir.

Personalmente non ricordo di aver avuto problemi, ma di solito non accludo le barre finali, quindi andate a provarlo.

UPDATE:

Ho appena provato il codice e ha creato ogni directory compresa l'ultima. Sto utilizzando Mac OS X 10.5. Nessuna idea perché non funziona per voi :-(

Questo è il codice che ho usato:

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

Siamo spiacenti, sembra come se fossi di nessun aiuto qui

+0

Questa è stata la prima cosa che ho fatto, ma produce comunque gli stessi risultati ... – NDM

2

Se si è tentato tutto ed è. continua a non funzionare, quindi aggiungere un testo alla fine del percorso, come:?

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

Ecco come l'ho 'risolto nel codice corrente ... Ma non ha proprio senso ... – NDM

+0

questo è un work-around sporco e non aiuta la domanda posta ... > Qualcuno mi può illuminare qui per favore? – Gnark

+1

Non dovresti mai usare codice che non capisci. –

1

Qual è la vostra versione di PHP è safe_mode attivata

?

Se è così, allora potrebbe essere che tu stia vivendo http://bugs.php.net/bug.php?id=43276

+0

5.2.4 senza safe_mode, quindi non è applicabile, ho anche provato con e senza le barre finali così .... – NDM

0

Le directory intermedi creati vengono impostati in base alla umask corrente. Si desidera qualcosa di simile

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

Funzione che crea tutte le directory (cartelle) del percorso specificato. Non c'è bisogno di scrivere codice per creare ogni directory (cartella) del percorso dato. creerà tutte le directory (cartelle).

Come: Se si desidera creare la struttura di directory come
organizzazioni/1/utenti/1/

modo che solo bisogno di chiamare questa funzione con il percorso directory come
$ directories_path = 'organizzazioni/1/utenti/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

Otterrete questo errore se si commette l'errore stupido ho fatto e passa una stringa, piuttosto che il letterale numerico per la modalità.

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

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