2010-08-25 11 views
3

Dans mon application, il y a un nom de dossier vidéos. Je veux raed tous les fichiers de ce dossier, j'ai fait presque, il ne montre aucun dossier dans les vidéos de dossier, sauf. DS_Store actuellement j'ai appliqué si la condition de cacher cela, mais je veux une solution parfaite peut aider quelqu'un: - mon code est la suivante: ----lire les fichiers dans le dossier

$dir = "../videos/"; 
$dh = opendir($dir); 

print '<select size="4" name="vidfile">'; 

while (($file = readdir($dh)) !== false) { 

    if (is_file($dir.'/'.$file) && $file != "." && $file != "..") { 

     if ($file!=".DS_Store") { 

      print "<option>{$file}</option>"; 
     } 
    }   
} 

print '</select>'; 

closedir($dh); 

Répondre

2
<?php 
$dir = '../videos/'; 
if($dh = opendir($dir)){ 
    echo '<select size="4" name="vidfile">'; 
    while(($file=readdir($dh)) !== FALSE){ 
     $file = $dir . '/' . $file; 
     if(!is_file($file) || substr($file, 0, 1) == '.'){ 
     continue; 
     } 
     printf('<option>%s</option>', htmlentities($file)); 
    } 
    echo '</select>'; 
    closedir($dh); 
} 
?> 

en premier lieu, si opendir échoue, ne pas continuer avec l'ordure. Il ignore les non-fichiers (répertoires) et les fichiers commençant par un point (y compris., .htaccess, etc.)

1

Voici une variante qui fonctionne avec glob() à la place, dispose d'un tableau de fichiers exclus et collecte tous les éléments option, puis les affiche en un seul. En outre, glob() permet le filtrage de certaines extensions de fichier grâce à sa syntaxe d'accolade, comme indiqué dans la ligne hors commentaire.

$dir = "../videos"; 
$mask = "*"; 
// $mask = "*.{wmv,mpeg,mpg}"; // get only files of these types 

$files = glob($dir."/".$mask); 
$excluded_files = array(".DS_store"); 
$html = null;  

if (count($files) > 0) 
foreach ($files as $file) 
{ 
    $filename = basename($file); 
    if (in_array($filename, $excluded_files)) continue; 
    $html.="<option>".htmlentities($filename)."</option>"; 
} 

echo $html; 
0

Juste if ($file[0] == ".") continue; au lieu de ces 2 si c'est probablement ce que vous cherchez.
Bien que je le rende légèrement différent, en 2 parties.
obtenir une partie de données:

<?php 
    $dir = "../videos/"; 
    $dh = opendir($dir); 
    $filesarr = array(); 
    while (($file = readdir($dh)) !== false) { 
    if ($file[0] != ".") $filesarr[] = $file; 
    } 
    closedir($dh); 
?> 

et une partie des données d'affichage:

<select size="4" name="vidfile"> 
<?php foreach ($filesarr as $file): ?> 
<option><?php echo $file ?></option> 
<?php endforeach ?> 
</select> 

il me semble bien plus propre à

13

La solution rapide et facile

Vous pourriez faire votre vie plus facile et utilisez un DirectoryIterator pour parcourir le répertoire.

echo '<select name="vids" size="4">'; 
foreach(new DirectoryIterator('/path/to/videos') as $file) { 
    if($file->isFile() === TRUE && $file->getBasename() !== '.DS_Store') { 
     printf("<option>%s</option>\n", htmlentities($file->getBasename())); 
    } 
} 
echo '</select>'; 

Amélioration: Découplage Répertoire Filtrage du bâtiment selectbox

Si vous voulez découpler la logique de filtrage de la boucle foreach, vous pouvez sous-classe une FilterIterator à capsule logique dans c'est accept() méthode . Le DirectoryIterator doit être ensuite enveloppé dans le FilterIterator. Le point principal est bien sûr réutilisabilité:

class MyFilter extends FilterIterator 
{ 
    public function accept() 
    { 
     return $this->current()->isFile() === TRUE && 
       $this->current()->getBasename() !== '.DS_Store'; 
    } 
} 

$iterator = new MyFilter(new DirectoryIterator('/path/to/videos')); 

Lorsque vous utilisez foreach sur une iterator filtrée, il déclenchera automatiquement accept(). Si accept() renvoie FALSE, l'élément en cours sera filtré dans l'itération.

Vous créez le selectbox comme ça alors:

echo '<select name="vids" size="4">'; 
foreach($iterator as $file) { 
    printf("<option>%s</option>\n", htmlentities($file->getBasename())); 
} 
echo '</select>'; 

Alternative à sous-classement FilterIterator

Si vous êtes trop paresseux pour écrire un FilterIterator séparé ou pense qu'il est tout simplement pas la peine pour un cas spécifique ou déjà avoir des validateurs quelque part et ne veulent pas dupliquer leur code, mais veulent toujours découpler la création Filtering et SelectBox, vous pouvez également utiliser cette coutume FilterChainIterator et ajouter callbacks à elle:

$iterator = new FilterChainIterator(new DirectoryIterator('/path/to/videos')); 
$iterator->addCallback(function($file) { 
    return $file->isFile() === TRUE && 
      $file->getBasename() !== '.DS_Store';}); 

La création de selectbox serait le même que celui indiqué ci-dessus.


Amélioration: faire de la création de selectbox réutilisable

En outre, si vous voulez faire de la création de selectbox réutilisable, pourquoi ne pas créer une aide pour elle. Ci-dessous est un très simple qui utilise DOM pour créer le code HTML réel. Vous passez une Iterator et créerez le code HTML pour vous lorsque vous appelez est la méthode render() ou l'utiliser dans un contexte de chaîne:

class SelectBox 
{ 
    protected $iterator; 
    public function __construct(Iterator $iterator) 
    { 
     $this->iterator = $iterator; 
    } 
    public function render() 
    { 
     $dom = new DOMDocument; 
     $dom->formatOutput = TRUE; 
     $dom->loadXml('<select name="vids"/>'); 
     $dom->documentElement->appendChild(new DOMElement('option', 'Pick One')); 
     foreach($this->iterator as $option) { 
      $dom->documentElement->appendChild(
       new DOMElement('option', $option)); 
     } 
     return $dom->saveXml($dom->documentElement); 
    } 
    public function __toString() 
    { 
     return $this->render(); 
    } 
} 

Et puis imprimer un selectbox d'un itérateur est aussi simple que

echo new SelectBox(new MyFilter(new DirectoryIterator('/path/to/videos'))); 

C'est assez flexible, étant donné qu'il y a des itérateurs pour tout. Par exemple

echo new SelectBox(new ArrayIterator(array('foo', 'bar', 'baz'))); 

donnerait une manière ordonnée au format

<select> 
    <option>Pick One</option> 
    <option>foo</option> 
    <option>bar</option> 
    <option>baz</option> 
</select> 
+0

Pourquoi l'opérateur identique (===) dans '$ file-> isFile() === TRUE'? J'imagine que juste '$ file-> isFile()' fonctionnerait de la même manière. –

+0

+1 pour DirectoryIterator –

Questions connexes