Domanda

Sto cercando di fare uno script che elenca solo le cartelle all'interno di una cartella. La cosa è che ho gli utenti che possono creare cartelle all'interno delle loro cartelle quindi fondamentalmente quello che sto cercando di fare è di avere un modo per gli utenti di gestire i propri file e cartelle memorizzazione ... Il mio problema è che voglio fare php " pensare" che la cartella principale è la loro home directory e non può andare in alto di loro home directory. Attualmente la mia funzione php non lo fa, mostra solo il contenuto della directory ... e se l'utente passa di livello superiore e di nuovo di un livello ... e così via .... poteva sfogliare l'intero disco unità.

function directoryList($path) {
    $dirStruct = array();
    if(is_dir($path)) {
        $handle = opendir($path);
        while(($file = readdir($handle)) !== false) {
            if(@opendir($path.$file)) {
                chdir($path.$file);
                $absolutepath = getcwd();
                $dirStruct[] = array('path' => $absolutepath.'\\', 'name'=>$file);
            }
        }
    }
    return $dirStruct;
}
È stato utile?

Soluzione

Invece di dare all'utente un percorso assoluto, consentono solo loro di specificare percorsi che sono relativi ad un determinato percorso di base. Avanti, scrivere una funzione che rimuove qualsiasi "/../" per il percorso relativo e sei al sicuro (a patto che gli utenti non possono creare collegamenti sul server ...).

Se vuoi essere bello, si può abbinare la ".." con l'elemento prima che (in modo 'un /../ b' sarebbe diventato 'b', vale a dire la ".." rimuovere la 'a' ) o ignorare la ".." se non v'è alcun elemento del percorso prima di esso.

Altri suggerimenti

Ecco un piccolo qualcosa per espandere su:

function listFolders($folderPath, $homeFolder)
{
    $folderPath = realpath($folderPath);
    $homeFolder = realpath($homeFolder);
    if(strpos($folderPath, $homeFolder) === 0) {
        return glob("$folderPath/*", GLOB_ONLYDIR);
    }
}

$dirs = listFolders('/home/gordon/code/php', '/home/gordon');
print_r($dirs);

Per $folderPath si passa nella cartella che si desidera elencare le directory da. Per passaggio $homeFolder nella cartella che si desidera essere il più cartella principale. Con realpathing entrambi i percorsi è assicurarsi che si risolvono a percorsi assoluti. Se il $folderPath è inferiore al $homeFolder, quindi la stringa $folderPath inizierà con e contiene l'intera stringa $homeFolder. Se questo è il caso, abbiamo appena glob tutte le directory nel $folderPath e restituire loro sentieri assoluti in un array.


Per ottenere il percorso relativo del $folderPath dal $homeFolder, basta fare

ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/');

, che sarebbe tornato ./code/php/.


Se si vuole fare questo con OOP, si potrebbe essere interessato al SPL DirectoryIterator .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top