ExamineFtpDirectory se mélange les pinceaux?

Sujets variés concernant le développement en PureBasic
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

ExamineFtpDirectory se mélange les pinceaux?

Message 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? :?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Message 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... :(
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Salut.

Et ce code ne fonctionne pas?
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Message 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
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

et en remplacant :
If FTPDirectoryEntryName(0) <> "."
par
If FTPDirectoryEntryName(0) <> "." Or FTPDirectoryEntryName(0) <> ".."
Cela doit fonctionner.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Message 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...
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Comment sais-tu que l'heure est un répertoire?
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Message 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").
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Message 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...
Répondre