2010-06-17 10 views
40

Poniższy kod będzie lista wszystkich plików w katalogulista PHP określonych plików w katalogu

<?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> 

Chociaż jest to bardzo prosty kod spełnia swoje zadanie.

Szukam teraz sposobu na WYŁĄCZNIE pliki, które mają końcówkę .xml (lub .XML), jak to zrobić?

Odpowiedz

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); 
} 

Prosty sposób, aby spojrzeć na rozszerzenie za pomocą substr i strrpos

+1

Sprawdzanie, czy '$ file' jest' .' lub '..' jest bezużyteczne, jeśli już spróbujesz znaleźć określone rozszerzenie, ponieważ to już wyklucza te dwa przypadki. Ponadto, ze względów bezpieczeństwa, możesz chcieć usunąć ".." w ścieżce, aby uzyskać dostęp tylko do podkatalogu, a nie do katalogu rodzica lub rodzica. Rozważ to tylko wtedy, gdy twój katalog nie jest statyczny. – Yeti

+3

To odpowiada na oryginalne pytanie, ale myślę, że pytanie powinno brzmieć "czy istnieje wyraźna składnia PHP, która może zrobić to za Ciebie?". Odpowiedź brzmi "tak", jak widać po najwyższej głosującej odpowiedzi. – cartbeforehorse

173

Będziesz chcąc skorzystać glob()

Przykład:

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

nie jestem programistą PHP, I” m stary programator C. Gdzie, jeśli kod to dodaję? – Jessica

+1

@Jessica całkowicie zastąpiłeś swój kod tą pojedynczą linią. Zwróci tablicę wszystkich ścieżek plików mających rozszerzenie xml. Możesz to powtórzyć za pomocą 'foreach' do zbudowania listy HTML. – Gordon

+0

+1 Niesamowita odpowiedź. Nie wiedziałem o 'glob()' i zdecydowanie będę z tego korzystał od teraz. Dzięki! –

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

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

Można również użyć rekurencyjnej warianty iteratorów przemierzać całą hierarchię katalogów.

+4

W PHP> = 5.3 można również użyć GlobIteratora: http://de3.php.net/manual/en/class.globiterator.php – Gordon

+0

Link z @Gordon nie działa dla mnie, ale tutaj jest ta sama treść z przykładami: [GlobIterator :: __ construct] (http://php.net/manual/en/globiterator.construct.php). – Zuul

0

Najprostszą odpowiedzią jest wprowadzenie innego warunku '.xml' == strtolower(substr($file, -3)).

Ale również polecam używanie glob.

2

Lista plików i folderów w katalogu (pełny kod):
PS: trzeba Odkomentuj 5 linii jeśli chcesz tylko do konkretnych rozszerzeń

<?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

Jest to odpowiedź "jedno rozwiązanie dla wszystkich", z uwzględnieniem wszystkich możliwych ewentualności i wymagań. Jest to trochę gadatliwe, jeśli chodzi o powszechny przypadek, w którym pewne rzeczy można uznać za oczywiste. – cartbeforehorse

1

używam tego kodu:

<?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

Bardzo ładne rozwiązanie !!! Dzięki! –

0

można rozszerzyć klasę RecursiveFilterIterator tak:

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); 
    } 

Teraz można utworzyć wystąpienia RecursiveDirectoryIterator ze ścieżki jako argument tak:

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

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

To będzie lista plików w ramach tylko w bieżącym folderze.

Aby pobrać pliki w podkatalogach również przekazać $ iterator (ExtensionFIlter Iterator) do RecursiveIteratorIterator jako argument:

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

teraz uruchomić pętlę foreach tego iteracyjnej.Dostaniesz plików z określonym rozszerzeniem

Uwagi: - Upewnij się także, aby uruchomić ExtensionFilter przed RecursiveIteratorIterator, inaczej dostaniesz wszystkie pliki

Powiązane problemy