Frage an directory, php, file – PHP: Wie kann ich eine einzelne Datei aus einem Verzeichnis holen, ohne das gesamte Verzeichnis zu durchsuchen?

13

Ich habe ein Verzeichnis mit 1,3 Millionen Dateien, die ich in eine Datenbank verschieben muss. Ich muss nur einen einzelnen Dateinamen aus dem Verzeichnis holen, OHNE das gesamte Verzeichnis zu durchsuchen. Es spielt keine Rolle, welche Datei ich greife, da ich sie löschen werde, wenn ich damit fertig bin, und dann zum nächsten übergehe. Ist das möglich? Alle Beispiele, die ich finden kann, scheinen die gesamte Verzeichnisliste in ein Array zu scannen. Ich muss immer nur einen zur Bearbeitung nehmen ... nicht jedes Mal 1,3 Millionen.

@ JonathanSampson Ich bezweifle, dass er sich um den Dateinamen kümmert. Er möchte eine beliebige Datei abrufen, in die Datenbank stellen und zur nächsten wechseln. Samy Dindane

Deine Antwort

4   die antwort
19

Dies sollte es tun:

<?php
$h = opendir('./'); //Open the current directory
while (false !== ($entry = readdir($h))) {
    if($entry != '.' && $entry != '..') { //Skips over . and ..
        echo $entry; //Do whatever you need to do with the file
        break; //Exit the loop so no more files are read
    }
}
?>

readdir

Gibt den Namen des nächsten Eintrags im Verzeichnis zurück. Die Einträge werden in der Reihenfolge zurückgegeben, in der sie vom Dateisystem gespeichert werden.

@SamyDindane, Diese Überprüfung wird nicht lange dauern, insbesondere im Vergleich zum Lesen der Datei von der Festplatte und zum Speichern in einer Datenbank ... Zombaya
@ Zombaya In der Tat dauert es keine Zeit. Ich habe es auf meinem Computer versucht: Es dauerte 200 ms, um zu laufenif ($entry != '.' && $entry != '..') {} 1,3 Millionen mal. Überraschend. Samy Dindane
Trotzdem könnte der Overhead vermieden werden (jede kleine Hilfe), indem einfach zwei Anrufe an getätigt werdenreaddir vor der Schleife, als. und.. sind immer die ersten Einträge. connec
Ich möchte lieber '.'und' .. 'in die Datenbank einfügen, als 1,3 Millionen mal zu prüfen. Samy Dindane
Dieser Code hat ein großes Problem, wenn ein Verzeichniseintrag unerwünscht ist, wie ein anderes Verzeichnis oder ein Symlink usw. -Verwenden Sie besser den Standard-Verzeichnisiterator, der splfileinfo-Objekte bereitstellt. hakre
5

dem ersten Eintrag, der eine Datei ist:

foreach(new DirectoryIterator('.') as $file)
{
    if ($file->isFile()) {
        echo $file, "\n";
        break;
    }        
}

Dadurch wird auch sichergestellt, dass Ihr Code auf einem anderen als dem erwarteten Dateisystem ausgeführt wird.

SehenDirectoryIterator undSplFileInfo.

Ja, jetzt ist es klar. Danke fürs Erklären. skibulk
@skibulk: Nein tut es nicht, es iteriert über dieDirectoryIterator Das ist kein Array, sondern ein Objekt. Dies verhindert effektiv, was Sie befürchten: ein Array. hakre
@skibulk: Ja, du könntest so darüber nachdenken. Genauer gesagt ruft es aufDirectoryIterator::next(), dies liegt vertraglich in PHP zwischenforeach und dasIterator Schnittstelle. Klarer? hakre
Lädt dies nicht den gesamten Verzeichnisinhalt in ein Array? Das ist es, was Kyle zu vermeiden versucht. Das könnte einen Unterschied machen, wenn Sie Tausende von Dateien im Ordner haben. skibulk
Cool. ich bin es gewohnt zuforeachArrays. Also wannforeach greift auf den nächsten Index derDirectoryIteratorwird stattdessen eine Methode aufgerufen (IE getNextFile ())? Seltsam. skibulk
0

ide? benutze das:

Erstelle die Funktion "pickfirst" mit 2 Argumenten (Adresse und Modus dir oder Datei?)

function pickfirst($address,$file) { // $file=false >> pick first dir , $file=true >> pick first file
$h = opendir($address);

     while (false !== ($entry = readdir($h))) {

          if($entry != '.' && $entry != '..' && ( ($file==false && !is_file($address.$entry)) || ($file==true && is_file($address.$entry)) )  )
          { return $entry; break; } 

} // end while
} // end function

Wenn Sie möchten, wählen Sie das erste Verzeichnis in Ihrem Adressensatz$file auf false setzen und wenn Sie die erste Datei in Ihrem Adressensatz auswählen möchten$file zu wahr.

Viel Glück :)

2

readdir werde den Trick machen. Überprüfen Sie das Beispiel auf dieser Seite, aber anstatt den readdir-Aufruf in der Schleife auszuführen, tun Sie es einfach einmal. Sie erhalten die erste Datei im Verzeichnis.

Hinweis: Abhängig vom Server erhalten Sie möglicherweise ".", ".." und andere ähnliche Antworten. Daher sollten Sie zumindest eine Schleife ausführen, bis Sie eine gültige Datei erhalten.

Verwandte Fragen