• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Suche einer Datei in einem Ordner

imoney91

Mitglied
Hallo Community,

ich möchte eine Datei nach der Dateiendung z. B "jpeg" in einem Ordner und auch in den Unterordnern suchen.
Ich weiß aber noch nicht, wie ich es anstellen soll.

mfg
 
Sieh dir dazu mal PHPs glob() an, damit kannst du in Ordnern suchen. Allerdings funktioniert das nicht rekursiv, d.h. es wird nicht in Unterordnern gesucht.

Eine rekursive Funktion findest du in den Kommentaren z.B. hier oder hier ;)
 
Es gibt mehere Funktionen, die Inhalte aus Verzeichnissen lesen.

PHP: scandir - Manual liest Dateien und Verzeichnisse aus, PHP: glob - Manual erlaubt nach bestimmten Mustern zu suchen.


Eine etwas variablere Variante ist diese hier, wo man Pfad und Typ selber angeben kann
PHP:
function show_files($path, $ftype)
{
   $dir = opendir ($path);
   while (false !== ($file = readdir($dir)))
   {
      if (strpos($file, $ftype,1))
      {
        $filelist[] = $file;
      }
   }
   return $filelist;
}

$ergebnis = show_files("pics",".jpeg");


// Ausgabe des Arrays $ergebnis
print_r($ergebnis);
Zeigt alle .gif Dateien aus dem Verzeichnis pics
 
er gibt mir nichts aus.
Ich habe für den Parameter $path einen absoluten Pfad gegeben und $ftype habe ich "mimetype" gegeben.
Wieso habe ich dadurch keinen Output?

Wenn ich aber den Typ auf .html ändere, dann liefert er mir Ergebnisse
 
Hast du überhaupt eine Datei die mit '.mimetype' endet??? Wenn ja - sehr eigenartig. Dann solltest du aber auch '.mimetype' und nicht nur 'mimetype' schreiben.

Aber ich denke eher du hast mit mimetype etwas anderes vor?
 
Sry, du hast natürlich recht. Die Datei endet nicht auf mimetype, sondern heißt mimetype ohne Extension. Ich kann doch auch generell abfragen oder? Nicht nur nach der Extension sondern allgemein.

Aber ich hab jetzt das Problem gefunden, denn ich habe es mit .jpg und .html probiert. Und das ist natürlich noch nicht rekursiv xDDD
Muss ich noch reinbauen.
 
PHP:
$ergebnis = show_files("pics",".jpeg");
Zeigt alle .gif Dateien aus dem Verzeichnis pics

Ehrlich? Alle .gif Dateien? :D

Das Problem bei deiner Routine ist, dass er auch Dateien finden würde die z.B. "bild.jpg.gif" heißen, wenn ich nach ".jpg" Dateien suche. Besser wäre hier per RegEx zu suchen.


er gibt mir nichts aus.
Ich habe für den Parameter $path einen absoluten Pfad gegeben und $ftype habe ich "mimetype" gegeben.
Wieso habe ich dadurch keinen Output?

Wenn ich aber den Typ auf .html ändere, dann liefert er mir Ergebnisse

Das liegt daran, dass $ftype in dieser Routine für den Teil steht, der in dem Dateinamen gesucht werden soll. Gibst du "mimetype" an, findet er alle Dateien, derren Dateiname irgendwo (nach dem ersten Zeichen) "mimetype" enthält. Gib ".jpg" als $ftype an, um das gewünschte Ergebnis aus dem ersten Post zu erzielen.

[EDIT]

scbawik war schneller, ich hab zu lang geschrieben ;D
 
Zuletzt bearbeitet:
Mein Code sieht momentan so aus

function show_files($path, $ftype){
$dir = opendir ($path);
while (false !== ($file = readdir($dir)))
{
if (strpos($file, $ftype,1))
{
$filelist[] = $file;
}
}
return $filelist;
}


$ergebnis = show_files("frontend/extrEpub/111/","mimetype");




// Ausgabe des Arrays $ergebnis
print_r($ergebnis);
?>

Meine Hierarchie so:

/www/frontend/extrEpub/111/mimetype

mimetype ist die Bezeichnung meiner Datei, aber ich habe keine Ausgabe.
Wieso?

Abgesehen, dass es noch nicht die Unterverzeichnisse lesen kann, habe ich somit das direkte Verzeichnis angegeben. Somit müsste er theoretisch mein mimetype anzeigen.
 
Das hättest du auch im anderen Thread posten können, da wäre der Bezug zu meinem Code gewesen....

Es werden alle dateien mit der Endung .mymtype angezeigt, also tralala.mymetype, hoppla.mymetype etc.
Die Frage ging vorhin nach .gif oder .jpg aus einem Verzeichnis.
Der Code zerlegt einen Dateinamen in seine Bestandteile und zeigt alle vom Typ .txt, .gif, .odf etc an.
 
Danke nochmal für den Hinweis. Meine momentane Lösung sieht nun so aus:

function show_files($path, $ftype){
$dir = opendir ($path);
while (false !== ($file = readdir($dir)))
{
if (strpos($file, $ftype) !== false)
{
$filelist[] = $file;
}
}
return $filelist;
}


$ergebnis = show_files("frontend/extrEpub/111/","mimetype");




// Ausgabe des Arrays $ergebnis
print_r($ergebnis);

Ich suche jetzt nicht nach der Dateiendung sondern den ganzen String nach mimetype ab. Da EPUB ein etablierter Standard ist, werden Komponenten immer so und nur einmalig benannt. Dadurch verhindere ich Redundanz. Jetzt fehlt mir nur noch die Rekursion.
 
Ich bin ganz nahe dran. Ich habe jetzt versucht, die Dateisuche mit einer Rekursion zu erweitern. Allerdings gibt er mir noch willkürliche Sachen zurück.

Ich weiß noch nicht so genau, an was es liegt:

Code:
<?php$content;
function searchingFile($dir, $ftype) {
    $handle = opendir($dir);
    while (false !== ($file = readdir($handle))){
        if ($file != '.' && $file != '..') {
            if (is_dir($dir . '/' . $file)) {
                searchingFile($dir . '/' . $file, 'ncx');
                //verzeichnis gefunden
            }
        }
        elseif(strpos($file, $ftype) !== false) {


                $searFile = $file;
                $content = $searFile;
            }
            //datei gefunden!
    }
    return $content;
    closedir($handle);
}






searchingFile('frontend/extrEpub/111/', 'ncx');
//echo ($content);
?>
 
Zuletzt bearbeitet:
Allerdings gibt er mir noch willkürliche Sachen zurück.
Das bedeutet was?

So wie ich das sehe, bekommst du doch maximal eine Datei geliefert und nicht alle. Außerdem wäre es schön, wenn du den Quellcode mal ordentlich einrücken würdest, damit man das auch mal lesen kann.
 
Probiers mal so:

PHP:
<?php
    function searchingFile($dir, $ftype, $rec = 0, $level = 1){
        $handle = opendir($dir);
        $result = array();
        if($rec > 1) $level--;
        
        while(false !== ($file = readdir($handle))){
            if($file == '.' && $file == '..') continue;
            
            if(is_dir($dir . '/' . $file)){
                //Unterverzeichnis einlesen
                if($rec > 0 && $level > 0){
                    $subdir = searchingFile($dir . '/' . $file, '.jpg', $rec, $level);
                    $result = array_merge($result, $subdir);
                }
            } elseif(strpos($file, $ftype)){
                //Datei passt auf Suchparameter
                $result[$dir][] = $file;
            }
        }
        closedir($handle);
        return $result;
    }

    $search = searchingFile('frontend/extrEpub/111/', '.jpg', 1);
    echo '<pre>';
    print_r($search);
    echo '</pre>';
?>

Um mehrere Dateien auszugeben, musst du diese entweder sofort rausprinten oder wie hier in ein Array schreiben. Ich habe die Funktion etwas ausgeschmückt, damit du die Rekursion ein- & ausschalten kannst und die Tiefe bestimmen kannst.

[EDIT]

Fehler im Code behoben ;)

$rec = 0 => Rekursion ausgeschaltet
$rec = 1 => Rekursion eingeschaltet
$rec = 2 => Rekursion eingeschaltet, Anzahl der angegebenen Level wird beachtet
 
Zuletzt bearbeitet:
@Timmer: Danke für den Code!!! Ich werde mal versuchen dein Code komplett zu verstehen und nach meinen Bedürfnissen anzupassen ^^
Eine Komplettlösung wollte ich eigentlich gar nicht xD ABER danke!

Um mehrere Dateien auszugeben
Ich zerlege eine .epub Datei mit möchte dann auf vereinzelte Dateen zugreifen. Da epub ein Standard ist, sind die Dateibezeichnungen immer identisch.
Deswegen ist jedes Files unique.
Mein Ziel ist somit diese eindeutige Datei aus dem entzippten epub aus einem Verzeichnis auszulesen und deren Content in eine Variable zuschreiben.

Mit meinem bisherigen Code liest er aber alle html Dateien aus dem Verzeichnis.
Ich werde es morgen früh gleich mal probieren.

Jetzt Feierabend.

:grin:
 
Ich habe jetzt deins erfolgreich angepasst und es läuft soweit! ABER ich habe noch eine Frage.
Wenn ich mein Code Fragment so aufrufe, dann sucht er mir schön rekursiv alle Daten raus, die ich haben will.

Code:
function searchingFile($dir, $ftype) {
    $handle = opendir($dir);
    $resultArray = array();
    while (false !== ($file = readdir($handle))){
        if ($file != '.' && $file != '..') {


            if (is_dir($dir . '/' . $file)) {
                //unterverzeichnis einlesen
                $subdir = searchingFile($dir . '/' . $file, $ftype);
                $resultArray = array_merge($resultArray, $subdir);
            }
        }
        if(strpos($file, $ftype)) {
            //datei gefunden
            $resultArray[] = $dir.'/'.$file;
        }
    }
    closedir($handle);


    return $resultArray;


}




$search = searchingFile('/data/multiserv/users/810869/projects/1994640/www/frontend/extrEpub/111/', 'mimetype');
print_r($search)

WENN ich aber die gleiche Funktion in einer gesonderten php Klasse ( per include Aufruf ) mit einer anderen Funktion aufrufen möchte, dann gibt er mir folgende Fehlermeldung:

Fatal error: Call to undefined function searchingFile() in /data/multiserv/users/810869/projects/1994640/www/ebookLib/ebookRead.php on line 79

Meine Klasse sieht folgendermaßen aus:

Code:
private function searchingFile($dir, $ftype) {
        $handle = opendir($dir);
        $resultArray = array();
        while (false !== ($file = readdir($handle))){
            if ($file != '.' && $file != '..') {


                if (is_dir($dir . '/' . $file)) {
                    //unterverzeichnis einlesen
                    $subdir = searchingFile($dir . '/' . $file, $ftype);
                    $resultArray = array_merge($resultArray, $subdir);
                }
            }
            if(strpos($file, $ftype)) {
                //datei gefunden
                $resultArray[] = $dir.'/'.$file;
            }
        }
        closedir($handle);


        return $resultArray;


    }


---
	function processEpub(){


		//Read the mimetype file from extrated epub
        $mime = $this->searchingFile($this->ebookData->extrEpubPath,"mimetype");
        echo 'vorher: ';
        print_r($mime);
        echo '<br/>';
}


processEpub() hat schon immer funktioniert. Wenn ich searchingFile () rekursiv aufrufe, dann sagt er mir im rekursiven Teil, wo er versucht die Funktion noch einmal aufzurufen, dass er meine Funktion nicht findet?!

Wieso???

Ich versteh es einfach nicht...
 
Zuletzt bearbeitet:
Naja, ganz einfach: Du rufst die Funktion auf, ohne die Klasse anzugeben. Dadurch sucht er nach der Funktion außerhalb der Klasse.

Probiers mit $this->searchingFile(...);

Kleiner Tipp: Benutz
PHP:
 statt [CODE], um den PHP-Code zu highlighten =)
 
ahhhh mein Gott :lol: Natürlich xDDD
Oh man, werd ich gleich ausbessern.
Ich habe es mal mit dem PHP Tag versucht, aber dann sind die Formatierungszeichen nicht mehr drin und der Code schaut fürchterlich aus^^.

Danke für den Hinweis.

Schönes Wochenende!
 
Ich verstehe die Dateiendungssuche so, dass ich eine Dateiname inklusive Dateiendung in ein string umwandle und dann mit der Funktion substring das gesuchte herausfiltere. Z. B ich suche nach .jpg, dann durchsucht er mir den kompletten String z. B test.jpg nach dem Paramter ".jpg" und gibt mir true oder false zurück.

Wenn ich aber z. B bei der Datei "mimetype" nach "mimetype" suche, dann liefert er mir nichts zurück! Suche ich aber nach "imetype" dann findet er es durchaus! Hat es etwas mit dem Index zutun? Oder wieso verwertet er den ersten char aus dem string nicht?

gruß
 
Zurück
Oben