webForumDet fria alternativet

Söka i kataloger...

16 svar · 371 visningar · startad av Hubert

HubertMedlem sedan maj 200219 inlägg
#1

Jag skulle vilja ha ett trevligt litet script där man kan söka i flera kataloger.
Jag har försökt med lite olika gerjer, men får det inte att funka. Jag har lyckats skrivat ut alla filer i en katalog på skärmen. Men jag får det itne att funka med flera, och inte heller att söka.

Här är lite kod jag använt:

<?php 
if ($handle = opendir("/home/mp3")) { 
    while (false !== ($file = readdir($handle))) { 
        if ($file != "." && $file != "..") { 
            echo "$file\n<br>"; 
        } 
    } 
    closedir($handle); 
} 
?>

Mvh Hubert

SPiNMedlem sedan mars 20007 896 inlägg
#2

Så här skulle jag ha gjort, med en liten rekursiv funktion:

function PrintDirs ( $directory ) {
     $reader = opendir ( $directory );

     while ( $cur = readdir ( $reader ) ) {
          if ( is_dir ( $directory . $cur ) ) {
               PrintDirs ( $cur . "\\" );
          }
          if ( is_file ( $directory . $cur ) ) {
               echo $cur . " är en fil i " . $directory . "<br />";
          }
     }

     closedir ( $reader );
}

Så här anropar du den:

PrintDirs ( "C:\\Windows\\" );

Vill du söka i de filerna som ligger i katalogen får du öppna dem i if-satsen med is_file (), och söka.

HubertMedlem sedan maj 200219 inlägg
#3

funkar inte för mig, nåt speciellt man ska göra. typ $cur och $directory har väl inte så mycket till värde, eller? du kanske kan förklara lite för mig, jag är ju trots allt en liten noob.

SPiNMedlem sedan mars 20007 896 inlägg
#4

Hm, såg att jag hade missat att skicka med $directory vid rekurseringen... Så här bör den se ut:

function PrintDirs ( $directory ) {
     $reader = opendir ( $directory );

     while ( $cur = readdir ( $reader ) ) {
          if ( is_dir ( $directory . $cur ) ) {
               PrintDirs ( $directory . $cur . "\\" );
          }
          if ( is_file ( $directory . $cur ) ) {
               echo $cur . " är en fil i " . $directory . "<br />";
          }
     }

     closedir ( $reader );
}

Jag öppnar först en mapp-hanterare som pekar mot den angivna sökvägen. Om sökvägen är en mapp, skickas den till funktionen på nytt - rekursering. Om sökvägen är en fil så skrivs filnamnet ut och var den ligger. Nyckelfunktionerna är is_dir () och is_file (). :)

HubertMedlem sedan maj 200219 inlägg
#5

glärg, jag får det inte att funka, jag gör så här:

<?
$directory = "/home/mp3";

function PrintDirs ( $directory ) {
     $reader = opendir ( $directory );

     while ( $cur = readdir ( $reader ) ) {
          if ( is_dir ( $directory . $cur ) ) {
               PrintDirs ( $directory . $cur . "\\" );
          }
          if ( is_file ( $directory . $cur ) ) {
               echo $cur . " är en fil i " . $directory . "<br />";
          }
     }

     closedir ( $reader );
}

?>

jag måste vara helt pucko... men är man nybörjare så år man. :OO

SPiNMedlem sedan mars 20007 896 inlägg
#6

Vad händer då? Får du ett felmeddelande eller något?

Prova med att sätta variabeln till:
$directory = "C:\\Sökväg\\home\\mp3\\";

HubertMedlem sedan maj 200219 inlägg
#7

inget felmeddelande, jag har en linux server, och sökvägen är /home/mp3. men det funkar inte, det skriver bara inte ut något.
du kan ju testa att gå in på http://forssen.pointclark.net/fil.php .

HubertMedlem sedan maj 200219 inlägg
#8

koden ser ut så här nu:

<?
$directory = "\home\mp3";

function PrintDirs ( $directory ) {
$reader = opendir ( $directory );

 while ( $cur = readdir ( $reader ) ) {
      if ( is_dir ( $directory . $cur ) ) {
           PrintDirs ( $directory . $cur . "\\\\" );
      }
      if ( is_file ( $directory . $cur ) ) {
           echo $cur . " är en fil i " . $directory . "\<br /\>";
      }
 }

 closedir ( $reader );

}

?>

SPiNMedlem sedan mars 20007 896 inlägg
#9

Försök med det här då:

function PrintDirs ( $directory ) {
     if ( substr ( $directory, -1 ) != '/' ) {
          $directory .= "/";
     }

     $reader = opendir ( $directory );

     while ( $cur = readdir ( $reader ) ) {
          if ( is_dir ( $directory . $cur ) ) {
               PrintDirs ( $directory . $cur );
          }
          else {
               echo $cur . " är en fil i " . $directory . "<br />";
          }
     }

     closedir ( $reader );
}

Anropa:

PrintDirs ( "/home/mp3" );
HubertMedlem sedan maj 200219 inlägg
#10

nu fick jag felmeddelande:

Warning: OpenDir: Too many open files (errno 24) in /var/www/html/fil.php on line 15

Warning: Supplied argument is not a valid Directory resource in /var/www/html/fil.php on line 17

Warning: Supplied argument is not a valid Directory resource in /var/www/html/fil.php on line 26

Warning: OpenDir: Too many open files (errno 24) in /var/www/html/fil.php on line 15

Warning: Supplied argument is not a valid Directory resource in /var/www/html/fil.php on line 17

Warning: Supplied argument is not a valid Directory resource in /var/www/html/fil.php on line 26
ölstugan som inte finns.mp3 är en fil i /home/mp3/./././././././././././././././././(den skriver ut svin många ./, det blev 51000 tecken först när jag skulle skriva detta inlägg) osv. osv.

kod:

<?
PrintDirs ( "/home/mp3" );

function PrintDirs ( $directory ) {
if ( substr ( $directory, -1 ) != '/' ) {
$directory .= "/";
}

 $reader = opendir ( $directory );

 while ( $cur = readdir ( $reader ) ) {
      if ( is_dir ( $directory . $cur ) ) {
           PrintDirs ( $directory . $cur );
      }
      else {
           echo $cur . " är en fil i " . $directory . "\<br /\>";
      }
 }

 closedir ( $reader );

}

?>

HubertMedlem sedan maj 200219 inlägg
#11

men alltså, kan man inte typ göra så att den läser alla filer i en eller flera kataloger, och sen så lagrar den det på nåt sätt, och sen kan man använda det lagrade till att söka i och då visar den det som den matchar sökordet med? liksom man ska kunna söka efter en fil. jag läste nåt om att man kunde läsa en katalog till en array, kan man göra nåt på det viset?

SPiNMedlem sedan mars 20007 896 inlägg
#12

Humma...

function PrintDirs ( $directory ) {
     if ( substr ( $directory, -1 ) != '/' ) {
          $directory .= "/";
     }

     $reader = opendir ( $directory );

     while ( ( $cur = readdir ( $reader ) ) !== false ) {
          if ( $cur == "." || $cur == ".." ) {
               continue;
          }
          if ( is_dir ( $directory . $cur ) ) {
               PrintDirs ( $directory . $cur );
          }
          else {
               echo $cur . " är en fil i " . $directory . "<br />";
          }
     }

     closedir ( $reader );
}
SPiNMedlem sedan mars 20007 896 inlägg
#13

Jäpp, istället för raden echo i else-blocket kan du lägga in allt i en array om du känner för det. :)

HubertMedlem sedan maj 200219 inlägg
#14

nu funkar det, men kan man göra nån sök funktion på det här? för skriva ut alla filer har funkat innan, nästan. men det hade vart bra om man kan fixa en sök funktion. tack för all hjälp.

SPiNMedlem sedan mars 20007 896 inlägg
#15

Javisst kan du göra en sökfunktion. Vill du söka i filerna, eller på deras filnamn? Här är ett enkelt sätt för att söka på filnamnet:

function PrintDirs ( $directory, &$arrResult ) {
     if ( substr ( $directory, -1 ) != '/' ) {
          $directory .= "/";
     }

     $reader = opendir ( $directory );

     while ( ( $cur = readdir ( $reader ) ) !== false ) {
          if ( $cur == "." || $cur == ".." ) {
               continue;
          }
          if ( is_dir ( $directory . $cur ) ) {
               PrintDirs ( $directory . $cur, $arrResult );
          }
          else {
               $arrResult[] = $directory . $cur;
          }
     }

     closedir ( $reader );
}

function SearchFiles ( $searchString, &$arrFiles ) {
     $arrResult[] = "Sökning för " . $searchString . ". Följande hittades:";

     for ( $i = 0; $i < count ( $arrFiles ); $i++ ) {
           if ( !stristr ( $arrFiles[ $i ], $searchString ) ) {
                $arrResult = $arrFiles[ $i ];
           }
     }

     return $arrResult;
}

PrintDirs ( "/home/mp3", $arrFoundFiles );
$arrResult = SearchFiles ( "söksträng", $arrFoundFiles );

while ( $curResult = array_shift ( $arrResult ) ) {
     echo $curResult . "<br />";
}
?>
HubertMedlem sedan maj 200219 inlägg
#16

nu blev det lite fel:

Warning: Missing argument 2 for printdirs() in /var/www/html/fil.php on line 15

Warning: Missing argument 2 for searchfiles() in /var/www/html/fil.php on line 37

Warning: The argument needs to be an array in /var/www/html/fil.php on line 52

Här är koden:

<form name="form1" method="post" action="">
  <input type="searchString" name="textfield">
  <br>
  <input type="submit" name="Skicka" value="Skicka">
</form>
<?
PrintDirs ( "/home/mp3" );
SearchFiles ( $searchString );

function PrintDirs ( $directory, &$arrResult ) {
     if ( substr ( $directory, -1 ) != '/' ) {
          $directory .= "/";
     }

     $reader = opendir ( $directory );

     while ( ( $cur = readdir ( $reader ) ) !== false ) {
          if ( $cur == "." || $cur == ".." ) {
               continue;
          }
          if ( is_dir ( $directory . $cur ) ) {
               PrintDirs ( $directory . $cur, $arrResult );
          }
          else {
               $arrResult[] = $directory . $cur;
          }
     }

     closedir ( $reader );
}

function SearchFiles ( $searchString, &$arrFiles ) {
     $arrResult[] = "Sökning för " . $searchString . ". Följande hittades:";

     for ( $i = 0; $i < count ( $arrFiles ); $i++ ) {
           if ( !stristr ( $arrFiles[ $i ], $searchString ) ) {
                $arrResult = $arrFiles[ $i ];
           }
     }

     return $arrResult;
}

PrintDirs ( "/home/mp3", $arrFoundFiles );
$arrResult = SearchFiles ( "söksträng", $arrFoundFiles );

while ( $curResult = array_shift ( $arrResult ) ) {
     echo $curResult . "<br />";
}

?>
SPiNMedlem sedan mars 20007 896 inlägg
#17

Om du lägger till:
$arrFoundFiles = array ();
ovanför:
PrintDirs ( "/home/mp3", $arrFoundFiles ); ? Återkommer i morgon, är fruktansvärt trött just nu...

131 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)