2010-06-17 12 views
40

Der folgende Code listet alle die Datei in einem VerzeichnisPHP Liste bestimmter Dateien in einem Verzeichnis

<?php 
if ($handle = opendir('.')) { 
    while (false !== ($file = readdir($handle))) 
    { 
     if (($file != ".") 
     && ($file != "..")) 
     { 
      $thelist .= '<LI><a href="'.$file.'">'.$file.'</a>'; 
     } 
    } 

    closedir($handle); 
} 
?> 

<P>List of files:</p> 
<UL> 
<P><?=$thelist?></p> 
</UL> 

Während dieser sehr einfacher Code ist es die Arbeit erledigt.

Ich bin jetzt auf der Suche nach einer Möglichkeit, nur Dateien aufzulisten, die .xml (oder .XML) am Ende haben, wie mache ich das?

Antwort

44
if ($handle = opendir('.')) { 
    while (false !== ($file = readdir($handle))) 
    { 
     if ($file != "." && $file != ".." && strtolower(substr($file, strrpos($file, '.') + 1)) == 'xml') 
     { 
      $thelist .= '<li><a href="'.$file.'">'.$file.'</a></li>'; 
     } 
    } 
    closedir($handle); 
} 

Ein einfacher Weg, um die Erweiterung zu suchen substr und strrpos mit

+1

Überprüfen, ob '$ file'' .' oder '..' ist, ist nutzlos, wenn Sie bereits versuchen, eine bestimmte Erweiterung zu finden, da diese Fälle bereits ausgeschlossen werden. Aus Sicherheitsgründen möchten Sie möglicherweise auch '..' aus dem Pfad entfernen, sodass nur auf ein Unterverzeichnis und nicht auf ein Geschwister- oder Elternverzeichnis zugegriffen werden kann. Beachten Sie dies nur, wenn Ihr Verzeichnis nicht statisch ist. – Yeti

+3

Dies beantwortet die ursprüngliche Frage, aber ich denke, die Frage sollte wirklich sein "gibt es eine explizite PHP-Syntax, die das für Sie tun kann?". Die Antwort lautet ja, wie Sie an der höchsten, nach dem Votum angenommenen Antwort sehen. – cartbeforehorse

173

Sie werden glob()

Beispiel verwenden, werden zu wollen:

$files = glob('/path/to/dir/*.xml'); 
+1

ich bin kein PHP-Programmierer, ich Ich bin ein alter C-Programmierer. Wo, wenn der Code bin ich das hinzufügen? – Jessica

+1

@Jessica ersetzen Sie Ihren Code vollständig mit dieser einzelnen Zeile. Es wird ein Array aller Dateipfade mit der Erweiterung xml zurückgegeben. Sie können darüber mit 'foreach' iterieren, um dann Ihre HTML-Liste zu erstellen. – Gordon

+0

+1 Tolle Antwort. Ich wusste nicht über 'glob()' und werde es ab jetzt sehr oft verwenden. Vielen Dank! –

8
$it = new RegexIterator(new DirectoryIterator("."), "/\\.xml\$/i")); 

foreach ($it as $filename) { 
    //... 
} 

Sie auch die rekursive Varianten der Iteratoren verwenden können eine ganze Verzeichnishierarchie zu durchqueren.

+4

In PHP> = 5.3 können Sie auch den GlobIterator verwenden: http://de3.php.net/manual/en/class.globiterator.php – Gordon

+0

Link von @Gordon funktioniert nicht für mich, aber hier ist der gleiche Inhalt mit Beispielen: [GlobIterator :: __ Konstrukt] (http://php.net/manual/en/globiterator.construct.php). – Zuul

0

Die einfachste Antwort ist, eine andere Bedingung '.xml' == strtolower(substr($file, -3)) zu setzen.

Aber ich würde stattdessen glob stattdessen empfehlen.

2

LIST Dateien und Ordner in einem Verzeichnis (Full Code):
P. S. Sie müssen Kommentar- der 5. Zeile, wenn Sie nur für spezifische Erweiterungen

<?PHP 
# The current directory 
$directory = dir("./"); 

# If you want to turn on Extension Filter, then uncomment this: 
### $allowed_ext = array(".sample", ".png", ".jpg", ".jpeg", ".txt", ".doc", ".xls"); 




## Description of the soft: list_dir_files.php 
## Major credits: phpDIRList 2.0 -(c)2005 Ulrich S. Kapp :: Systemberatung :: 

$do_link = TRUE; 
$sort_what = 0; //0- by name; 1 - by size; 2 - by date 
$sort_how = 0; //0 - ASCENDING; 1 - DESCENDING 


# # # 
function dir_list($dir){ 
    $i=0; 
    $dl = array(); 
    if ($hd = opendir($dir)) { 
     while ($sz = readdir($hd)) { 
      if (preg_match("/^\./",$sz)==0) $dl[] = $sz;$i.=1; 
     } 
    closedir($hd); 
    } 
    asort($dl); 
    return $dl; 
} 
if ($sort_how == 0) { 
    function compare0($x, $y) { 
     if ($x[0] == $y[0]) return 0; 
     else if ($x[0] < $y[0]) return -1; 
     else return 1; 
    } 
    function compare1($x, $y) { 
     if ($x[1] == $y[1]) return 0; 
     else if ($x[1] < $y[1]) return -1; 
     else return 1; 
    } 
    function compare2($x, $y) { 
     if ($x[2] == $y[2]) return 0; 
     else if ($x[2] < $y[2]) return -1; 
     else return 1; 
    } 
}else{ 
    function compare0($x, $y) { 
     if ($x[0] == $y[0]) return 0; 
     else if ($x[0] < $y[0]) return 1; 
     else return -1; 
    } 
    function compare1($x, $y) { 
     if ($x[1] == $y[1]) return 0; 
     else if ($x[1] < $y[1]) return 1; 
     else return -1; 
    } 
    function compare2($x, $y) { 
     if ($x[2] == $y[2]) return 0; 
     else if ($x[2] < $y[2]) return 1; 
     else return -1; 
    } 

} 

################################################## 
# We get the information here 
################################################## 

$i = 0; 
while($file=$directory->read()) { 
    $file = strtolower($file); 
    $ext = strrchr($file, '.'); 
    if (isset($allowed_ext) && (!in_array($ext,$allowed_ext))) 
     { 
      // dump 
     } 
    else { 
     $temp_info = stat($file); 
     $new_array[$i][0] = $file; 
     $new_array[$i][1] = $temp_info[7]; 
     $new_array[$i][2] = $temp_info[9]; 
     $new_array[$i][3] = date("F d, Y", $new_array[$i][2]); 
     $i = $i + 1; 
     } 
} 
$directory->close(); 

################################################## 
# We sort the information here 
################################################# 

switch ($sort_what) { 
    case 0: 
      usort($new_array, "compare0"); 
    break; 
    case 1: 
      usort($new_array, "compare1"); 
    break; 
    case 2: 
      usort($new_array, "compare2"); 
    break; 
} 

############################################################### 
# We display the infomation here 
############################################################### 

$i2 = count($new_array); 
$i = 0; 
echo "<table border=1> 
       <tr> 
        <td width=150> File name</td> 
        <td width=100> File Size</td> 
        <td width=100>Last Modified</td> 
       </tr>"; 
for ($i=0;$i<$i2;$i++) { 
    if (!$do_link) { 
     $line = "<tr><td align=right>" . 
         $new_array[$i][0] . 
         "</td><td align=right>" . 
         number_format(($new_array[$i][1]/1024)) . 
         "k"; 
     $line = $line . "</td><td align=right>" . $new_array[$i][3] . "</td></tr>"; 
    }else{ 
     $line = '<tr><td align=right><A HREF="' . 
         $new_array[$i][0] . '">' . 
         $new_array[$i][0] . 
         "</A></td><td align=right>"; 
     $line = $line . number_format(($new_array[$i][1]/1024)) . 
         "k" . "</td><td align=right>" . 
         $new_array[$i][3] . "</td></tr>"; 
    } 
    echo $line; 
} 
echo "</table>"; 


?> 
+0

Dies ist eine "eine Lösung für alle" Antwort, mit allen möglichen Eventualitäten und Anforderungen berücksichtigt. Es ist ein bisschen ausführlich für den allgemeinen Fall, wo einige Dinge als selbstverständlich angesehen werden können. – cartbeforehorse

1

Ich benutze diesen Code:

<?php 

{ 
//foreach (glob("images/*.jpg") as $large) 
foreach (glob("*.xml") as $filename) { 

//echo "$filename\n"; 
//echo str_replace("","","$filename\n"); 

echo str_replace("","","<a href='$filename'>$filename</a>\n"); 

} 
} 


?> 
+0

Sehr schöne Lösung !!! Vielen Dank! –

0

Sie können die RecursiveFilterIterator Klasse wie folgt erweitern:

class ExtensionFilter extends RecursiveFilterIterator 
{ 
    /** 
    * Hold the extensions pass to the class constructor 
    */ 
    protected $extensions; 

    /** 
    * ExtensionFilter constructor. 
    * 
    * @param RecursiveIterator $iterator 
    * @param string|array $extensions Extension to filter as an array ['php'] or 
    * as string with commas in between 'php, exe, ini' 
    */ 
    public function __construct(RecursiveIterator $iterator, $extensions) 
    { 
    parent::__construct($iterator); 
    $this->extensions = is_array($extensions) ? $extensions : array_map('trim', explode(',', $extensions)); 
    } 

    public function accept() 
    { 
     if ($this->hasChildren()) { 
     return true; 
     } 

     return $this->current()->isFile() && 
     in_array(strtolower($this->current()->getExtension()), $this->extensions); 
    } 

    public function getChildren() 
    { 
    return new self($this->getInnerIterator()->getChildren(), $this->extensions); 
    } 

Jetzt können Sie RecursiveDirectoryIterator mit Pfad als Argument wie folgt instanziiert:

$iterator = new RecursiveDirectoryIterator('\path\to\dir'); 
$iterator = new ExtensionFilter($iterator, 'xml, php, ini'); 

foreach($iterator as $file) 
{ 
    echo $file . '<br />'; 
} 

Diese nur Dateien im aktuellen Ordner auflistet.

die Dateien in Unterverzeichnissen Um auch zu erhalten, übergeben die $ iterator (ExtensionFIlter Iterator) zu RecursiveIteratorIterator als Argument:

$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST); 

nun die foreach-Schleife auf diesem Iterator laufen.Sie werden die Dateien mit den angegebenen Erweiterung

Hinweis erhalten: - Vergewissern Sie sich auch die ExtensionFilter vor RecursiveIteratorIterator laufen, sonst werden Sie alle Dateien erhalten

Verwandte Themen