Page 1 sur 1

ExamineFtpDirectory se mélange les pinceaux?

Publié : mer. 10/juin/2009 10:54
par kelebrindae
Bonjour à tous,

Je constate un comportement bizarre de ExamineFtpDirectory() en PB4.31 x86 sous Windows XP, et je voudrais vous demander votre avis avant de faire un rapport de bug.

Voilà la situation:
Dans ma boîte, j'ai un serveur UNIX (sous AIX 5.3, pour les connaisseurs) accessible dans le réseau local. Sur ce serveur, j'ai un répertoire nommé "20090609".
Voilà le contenu du répertoire, vu par FileZilla:

Code : Tout sélectionner

Nom			Taille	Type		Date		Heure
20090609-190000.sur	51877	Fichier SUR	09/06/2009	19:08
20090609-190107.sur	52319	Fichier SUR	09/06/2009	19:09
20090609-190108.sur	51892	Fichier SUR	09/06/2009	19:09
20090609-190115.sur	55189	Fichier SUR	09/06/2009	19:09
Dans un programme PB, je me connecte par FTP à ce serveur, je me positionne dans le répertoire, et je demande la liste des fichiers qu'il contient.
Voilà le programme utilisé (trouvé sur le forum anglais):

Code : Tout sélectionner

InitNetwork()

Procedure list_ftp2(Ftp, Dir.s, Fulldir.s)
  Protected NewList Dirs.s()
  SetFTPDirectory(Ftp, Dir)
  If ExamineFTPDirectory(Ftp)
    While NextFTPDirectoryEntry(Ftp)
      If FTPDirectoryEntryType(Ftp) = #PB_FTP_Directory
        AddElement(Dirs())
        Dirs() = FTPDirectoryEntryName(Ftp)
      Else
        Debug Fulldir + "/" + FTPDirectoryEntryName(Ftp)
      EndIf
    Wend
    ForEach Dirs()
      list_ftp2(Ftp, Dirs(), Fulldir + "/" + Dirs())
    Next
  EndIf
  SetFTPDirectory(Ftp, "..")
EndProcedure

Procedure.s list_ftp(dir$)
  Protected ftp = OpenFTP(#PB_Any, "serveur", "login", "password") ; là, j'ai enlevé l'adresse du serveur et les login/password, parce que c'est confidentiel ;)
  If ftp
    list_ftp2(ftp, dir$, dir$)
    CloseFTP(ftp)
  EndIf
EndProcedure

; Lister le contenu du répertoire "20090609" sur le serveur
list_ftp("20090609") 
Et voilà ce que j'obtiens:

Code : Tout sélectionner

20090609/20090609-190115.sur
20090609/20090609-190108.sur
20090609/20090609-190107.sur
20090609/19:08 20090609-190000.sur  ; <= cette entrée est incorrecte!
Déjà, l'ordre est inversé, mais ça, à la limite, je m'en moque.
Le problème, c'est que sur le premier fichier (donc le dernier dans la liste), ExamineFtpDirectory s'est planté: le nom du fichier est faux (il semble contenir l'heure de création). De plus, FTPDirectoryEntryDate renvoie -1. Bref: cette entrée est inexploitable!

Ce bug se produit avec d'autres répertoires, et affecte indifféremment les fichiers ou les répertoires de la liste. Seul point commun: c'est toujours le premier de la liste qui est touché, et l'heure est toujours ajoutée au début du nom.

Vous avez une idée d'où ça peut venir? Une solution? :?

Publié : mer. 10/juin/2009 12:43
par djes
Je me demande s'il n'y a pas un dossier spécial (comme le .) qui n'est pas envoyé comme fichier. Faut que tu places un debug dans la procédure pour être sûr de chaque entrée.

Publié : mer. 10/juin/2009 13:53
par Backup
sous windows les 2 premiers fichiers sont

..
et
.

de memoire !!
ce sont des fichiers qui permettent de remonter a l'arborescence superieur ! ;)

. <-- remonté a l'arbo superieur
.. <-- remonte a la racine !

Publié : mer. 10/juin/2009 15:51
par kelebrindae
@Djes et Dobro:
Oui, mais ExamineFtpDirectory ne renvoie pas ces deux entrées.
( sous win, "." est le répertoire courant, ".." est le répertoire parent)

Par ailleurs, même si c'était le cas, je crois que ça ne changerait rien: c'est ce que je récupère directement de NextFTPDirectoryEntry qui est faux, pas l'affichage.
Et comme on n'a pas la main sur le fonctionnement de cette commande, je ne vois pas trop ce que je peux faire... :(

Publié : mer. 10/juin/2009 20:21
par djes
J'ai testé ton programme sur mon serveur FTP, il ne fonctionne pas correctement. Je verrai ça demain si j'ai le temps.

Publié : jeu. 11/juin/2009 3:24
par Geo Trouvpatou
Salut.

Et ce code ne fonctionne pas?

Publié : jeu. 11/juin/2009 9:15
par kelebrindae
@Geo:
Non, je viens de tester, je constate le même problème => la première entrée renvoyée par ExamineFtpDirectory se retrouve avec l'heure ajoutée au début du nom (et dans le cas présent, cette entrée est considérée comme un fichier alors que c'et un répertoire)

Code : Tout sélectionner

----------
---------- TRIéS
----------
Dossier : 20090611
Fichier : 22:11 20090610 ----- Taille : 0   <= entrée incorrecte ici
Fichier : latest.sur ----- Taille : 52657

Publié : jeu. 11/juin/2009 17:16
par Geo Trouvpatou
et en remplacant :
If FTPDirectoryEntryName(0) <> "."
par
If FTPDirectoryEntryName(0) <> "." Or FTPDirectoryEntryName(0) <> ".."
Cela doit fonctionner.

Publié : ven. 12/juin/2009 7:36
par kelebrindae
@Geo:
Non, même résultat. :(

Ce n'est d'ailleurs pas étonnant: ni ".", ni ".." ne font partie des entrées renvoyées par ExamineFTPDirectory => le test sur "." et ".." n'a donc aucun effet...

Publié : ven. 12/juin/2009 8:31
par djes
Comment sais-tu que l'heure est un répertoire?

Publié : ven. 12/juin/2009 8:53
par kelebrindae
@Djes:
Je sais que c'est un répertoire car:
- le serveur est sur notre réseau local et que j'y ai accès via l'explorateur Windows.
- si je fais un "setFTPdirectory" sur "20090610" (c'est-à-dire l'entrée incorrecte "22:11 20090610" moins l'heure), je peux me placer dans le répertoire en question.
- C'est moi qui ai créé ce répertoire via les commandes FTP de PB quelques jours avant (le 10/06/2009)

Je commence à me dire que le bug vient de ce qui est décrit dans la doc:
Note: for now, only unix-like servers are supported for directory listing. The FTP protocol doesn't specify how a directory listing has to be returned, so every server has its own way to returns the directory informations. Fortunately, most of the world servers are running under unix/linux and uses the same way to return the data. That said, there is no warranty than the listing works on every servers. This command will be updated on demand to automatically handle more servers type.
En gros, comme FTP ne normalise pas le format d'un listing de répertoire, chaque OS fait un peu comme il veut. Apparemment, AIX retourne un format qui n'est pas complètement compris par ExamineFTPDirectory().
=> je vais donc faire un rapport de bug dans le forum anglais, comme demandé dans la doc ("This command will be updated on demand to automatically handle more servers type").

Publié : ven. 12/juin/2009 9:10
par djes
Oui, c'est ce qu'il y a de mieux à faire.
AIX utilise souvent un système de fichiers journalisé; peut-être qu'il envoie la date de dernière modif.
Par contre pour le rapport, il faudrait que tu mettes un code qui fonctionne bien (sans parcourir tous les sous-dossiers par exemple), avec un simple debug de chaque entrée.

Publié : ven. 12/juin/2009 9:57
par kelebrindae
Oui, je vais mettre un code beaucoup plus simple, qui parcourt juste un répertoire et affiche en debug chaque entrée de ExamineFtpDirectory().

[EDIT]
ça y est, j'ai posté le rapport de bug dans le forum anglais à cette adresse:
http://www.purebasic.fr/english/viewtop ... 959#288959
On verra ce que ça donne...