leggere i file in una sottodir

peppepegasus

Utente Attivo
20 Ott 2006
108
0
0
ciao,

mi trovo a dover leggere i dati in una sottodir: nella dir principale ci sono altre dir e i file da leggere si trovano in ciascuna di queste dir, ma non riesco a capire come fare..per leggere in una dir uso questo codice:

PHP:
$directory="nome_dir_principale";

print "Import dati della directory: <b>".$directory."</b><br>";

$file_elaborati=0;
$dati_inseriti=0;

if ($handle = opendir("$directory")) { // if principale
	while (false !== ($file = readdir($handle))) {
		echo "nome file: $file <br/>";
//		prende solo i file... escludendo le directory
		if (!is_dir($file)) {
....

come faccio a dirgli che trovata la prima dir ci deve entrare dentro e leggere da lì i file, quando ha letto tutti i file di quella dir deve risalire e passare alla seconda dir etc..fin quando non ha letto in tutte le dir.
spero qualcuno mi può dare una mano..grazie..
ciao..
 
ho trovato la soluzione con i while che mi pare funzioni..
ho un altro problema..come si fa a leggere un file dopo un certo numero di righe?
grazie..
 
In questa maniera:
PHP:
<?php
$read = file('ciao.txt');
$data = "";
$from = 51;

for($i = 0; $i < $from - 1; $i++)
  $data .= $read[$i] . "\n";
?>
Se non sbaglio c'era un metodo più semplice, ma è tardi e non ho voglia di cercare. Male che va mi senti domani :D
 
ciao,

vi ringrazio per i suggerimenti però..io so diquante righe deve saltare..non so i byte..c'è un modo per calcolarlo? ho usato il ciclo for come suggerito da alessandro1997 ma non mi va, vi posto il codice
PHP:
*********** INIZIO GESTIONE FILE
if (!$p_file = fopen($directory2."/".$file,"r")) {
echo "Spiacente, non posso aprire il file $nome_file";
} else {
print "Elaborazione file ".$file." in corso.... <br/> ";
while(!feof($p_file)) { // leggi fino alla fine del file
//$linea = fgets($p_file, 255);
$data ="";
$from = 19;

for($i = 0; $i < $from - 1; $i++) {
$data .= $p_file[$i] . "\n";
echo "riga ke nn serve: $p_file[$i] <br/>";
}
$linea = fgets($p_file, 255);
echo "linea: $linea <br />";
$quote = preg_split('#\s+#s', $linea);

ma il sistema non mi funziona..dopo la 19 riga dovrebbe passare alla prima riga utile ma ciò non accade, come mai?
grazie per l'aiuto.
ciao.
 
Se usi il PHP5 come spero, puoi usare queste funzioni per iterare all'interno della directory:
PHP:
$dir_iterator = new RecursiveDirectoryIterator($directory);
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
// Itera all'interno di tutte le cartelle a iniziare da $directory

foreach ($iterator as $file) {
   if ($file->isFile()) {
      //  qui il tuo ciclo per la lettura del file
   }
}
Per risolvere il secondo caso invece è più complesso perché dipende da cosa devi cercare all'interno del file.
Se è una frase in particolare allora puoi usare una funzione di ricerca all'interno di una stringa, come stripos che trova il carattere iniziale della stringa cercata, da lì puoi iniziare a copiare il file.
Purtroppo non c'è un modo per convertire byte -> stringhe, perché il numero di byte è indipendente dalla lunghezza di una parola, ti basti pensare che dipende dal tipo di codifica della stringa per variare anche di parecchio.
Però puoi sempre leggere il file in un unico colpo con la funzione file_get_contents e trattare poi tutto come una normale stringa.
Se invece come dici sai dove si trova la parola da cercare, allora forse il metodo di Alessandro è il più veloce.
file mette tutto il file in un array dove in ogni elemento dell'array si trova una riga del file, calcolata dalla posizione 0 (il primo carattere) fino al carattere di fine riga.
Se sai qual'è la riga dove si trova la parola da cercare, ti basta fare
PHP:
$riga = file($file_da_cercare); $parola = $riga[numero_di_riga];
e in parola hai la riga del file dove sta la tua parola cercata.
Io lo trovo comunque un p' aleatorio come metodo perché se poi fai una modifica al file o comunque questo non corrisponde dovrai modificare tutto per cercare la parola, secondo me è meglio usare le funzioni di ricerca di stringa.
 

Discussioni simili