[PHP] - Recursief FTP doorlopen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 11:15
Ik heb het volgende probleem.

Van een ftp server moet ik alle bestandseigenschappen ophalen. Dit moet gebeuren van alle bestanden, dus ook die in subdirs e.d. Van te voren weet ik niet hoe diep de directorystructuur is, dus dit zal ik recursief moeten gaan doen. Nu heb ik de volgende functie geschreven:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function showFiles($dir) {
   global $ftpCon;
   $list = ftp_rawlist($ftpCon, $dir);
   for($i = 0; $i < sizeof($list); $i++) {
      $item = split("[ ]+", $list[$i]);
      $item_type = substr($item[0], 0, 1);
      if($item_type == 'd') {
         $newMap = $dir."/". $item[8];
         print "<TR><TD>MAP: $newMap</TD></TR>";
         showFiles($newMap);
      } else {
         print "<TR><TD>". $list[$i] ."</TD></TR>";
      }
   }
}

$currentFolder = ftp_pwd($ftpCon);
print "<TABLE>";
showFiles($currentFolder);
print "</TABLE>";

$ftpCon is dus een openstaande ftp stream.

Dit werkt echter niet zoals ik wil dat het werkt. Ik krijg nu van bepaalde dirs waarvan ik weet dat ze subdirs/files bevatten geen inhoud te zien. Wanneer ik echter de functie aanroep met de naam van die dir krijg ik wel alles te zien.

Weet iemand wat ik fout doe?

Acties:
  • 0 Henk 'm!

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 12-09 14:21

koli-man

Bartender!!!!

Als ik het goed begrijp: je roept de bestaande subdirectory aan, dan gaat het wel, maar als je de parent directory aanroept, die vervolgens recursief de subdirectory moet aanroepen dan gaat het fout.
Dan zou ik in jouw geval eens, na regel 6: echo $item_type doen en dan eens kijken of dat wel 'd' is wat hij bevat.

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 11:15
Die is gewoon 'd'. Hij print namelijk wel MAP: $newMap. Dat doet ie dus wel, maar vervolgens laat ie niet de inhoud van die dir zien.

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
doe 's elke keer een echo $newMap? Klopt die wel?

Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 11:15
chris schreef op 28 april 2004 @ 17:10:
doe 's elke keer een echo $newMap? Klopt die wel?
Uhm, hij laat iedere keer die $newMap zien (als het een dir is). Of bedoel je wat anders? Ik heb net even elke keer gewoon die $dir die binnenkomt geprint, maar dat is gewoon goed, op een of andere manier wil ie gewoon niet fatsoenlijk de inhoud lezen.

Is er toevallig iemand die ooit hetzelfde heeft proberen te doen die het wel gelukt is?

[ Voor 11% gewijzigd door Cavalera125 op 28-04-2004 17:57 ]


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 20-09 23:02
Geeft ftp_rawlist() ook de directories . en .. terug?
Als je die namelijk op deze manier recursief gaat doorlopen kom je niet echt ver.

Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 11:15
Nee, '.' en '..' zitten er niet bij.

Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Aliassen naar directories kunnen eventueel een bron van problemen zijn. En het ontbreken van executie-rechten op directories voor de ftp-ende user.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
Zo goed ik weet moet je als je een functie recursive wilt gebruiken, aan het begin van die functie reset() gebruiken. In jouw geval wordt dat dus:

PHP:
1
2
3
4
function showFiles($dir) {
  reset($dir);
  ...
}


Ik gebruik ook een functie recursive, maar dat is met een array, dus ik weet het niet zeker of het ook toepasbaar is in jouw geval. Nu ik het even nalees op die php link, lijkt het inderdaad alleen voor arrays te zijn. Maar goed, misschien brengt het je tot de oplossing.

Ook Knor is aangestoken met het ligfietsvirus!


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Ik heb zelf een klasse gemaakt waarmee FTP alles kan wat ik in een filesystem kan. Ik heb hem alleen nog niet uitgebreid getest.

http://home.wanadoo.nl/~vdvlist/fileclasses.phps.html

Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 11:15
Het kan aan mij liggen maar ik zie in jou class nou niet echt een functie die doet wat ik wil. Ik gebruik nu de volgende code die ik op php.net gevonden heb:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?
function files($dir) {
   global $conn_id;
   unset($list);
   unset($files);
   unset($folders);
   unset($folder);
   unset($file);
   @ftp_chdir($conn_id, $dir);
   $dir = ftp_pwd($conn_id);
   $list=Array(); 
   $list=ftp_nlist($conn_id, "$dir"); 
   $files = Array();
   $folders = Array();
   for($i = 0; $i != sizeof($list); $i++) {
      $entry = str_replace("//", "", $list[$i]);
      if(@ftp_chdir($conn_id, $entry)) {
         $folders[] = $entry;
            ftp_chdir($conn_id, $dir);
      } else {
         $files[] = $entry;
      }
   }
   print "\t<b> Dateien in ".$dir." :</b><br><br>";
   foreach($files as $file) {
      print $file."<br>";
   }
   print "\t<b>Ordner in ".$dir." :</b> <br><br>";
   foreach ($folders as $folder){
      print "\t".$folder."<br>";
      ftp_chdir($conn_id, $dir);
      files($folder);
   }
}

$server = '';
$user = '';
$pass = '';

$conn_id = ftp_connect($server);// Connect
$loginResult = ftp_login($conn_id, $user, $pass);

files("");
?>

Alleen nu is dus het probleem dat er ongeveer 400 directories doorgelopen moeten worden en bijna 1100 files. Dit duurt dus veel te lang. Is hier iets aan te doen?

[ Voor 12% gewijzigd door Cavalera125 op 30-04-2004 00:21 ]


Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Cavalera schreef op 30 april 2004 @ 00:21:
Alleen nu is dus het probleem dat er ongeveer 400 directories doorgelopen moeten worden en bijna 1100 files. Dit duurt dus veel te lang. Is hier iets aan te doen?
Kijk eens naar set_time_limit(), daarmee kun je de maximale executie tijd instellen.

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 11:15
MatHack schreef op 30 april 2004 @ 07:54:
Kijk eens naar set_time_limit(), daarmee kun je de maximale executie tijd instellen.
Ik heb nu set_time_limit(0) toegevoegd voordat de functie aangeroepen wordt. Ik had net echter nog een melding (Cannot find server) terwijl er wel al output op het scherm stond. Soms maakt hij het wel helemaal af. Heb net ff de tijd gemeten dat hij erover doet. Het is iets meer dan 7 minuten voor 477 files in 411 directories. Is er een manier om zoiets te versnellen?

Acties:
  • 0 Henk 'm!

Verwijderd

Cavalera schreef op 30 april 2004 @ 11:14:
[...]

Ik heb nu set_time_limit(0) toegevoegd voordat de functie aangeroepen wordt. Ik had net echter nog een melding (Cannot find server) terwijl er wel al output op het scherm stond. Soms maakt hij het wel helemaal af. Heb net ff de tijd gemeten dat hij erover doet. Het is iets meer dan 7 minuten voor 477 files in 411 directories. Is er een manier om zoiets te versnellen?
raw list downloaden en lokaal parsen ?

Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

Cavalera schreef op 30 april 2004 @ 00:21:
Alleen nu is dus het probleem dat er ongeveer 400 directories doorgelopen moeten worden en bijna 1100 files. Dit duurt dus veel te lang. Is hier iets aan te doen?
Cache-Engine Bouwen met bijv. MySQL ?
En 'incremental' je veranderingen bij houden..... >> je FTP-Structuur

[ Voor 4% gewijzigd door glashio op 30-04-2004 11:19 ]

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing

Pagina: 1