Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Est-il possible de remonter au répertoire parent avec "FtpSetCurrentDirectory"
merci d'avance
Hors ligne
as tu essayé avec ".." par exemple ?
Hors ligne
oui evidemment
Hors ligne
si tu as essayé ftpsetcurrentdirectory, tu as ptêt vu qu'il y avait ftpgetcurrentdirectory ?
si tu récupères le répertoire courant, tu supprimes la fin et ça te permet de retourner au répertoire
juste en dessous
si tu obtiens par exemple c:\windows\system32\ (je ne sais pas s'il y aura le \ ou / final)
avec une petite manipulation de chaine, tu obtiens facilement c:\windows\ !
et là, y'a plus qu'à faire un ftpsetcurrentdirectory !
t'en penses koi ?
Hors ligne
le soucis c'est que c'est en ftp alors je ne sais pas trop si ca va fonctionner comme cela aussi bien
Hors ligne
si ça fonctionne, post le petit bout de code qui va bien ! ;-)
Hors ligne
eu non a priori ca marche pas et je m'embete lol
Hors ligne
moi ça marche !
par exemple :
n_wininet iftp string ls_toto ls_toto = iftp.of_internetopen() ls_toto = iftp.of_ftp_internetconnect("xx.xx.xx.xx","jdobosz","yyyyyyyy") iftp.of_ftp_getcurrentdirectory(ls_toto) messagebox("debug",ls_toto) // me donne /home/jdobosz // ps : j'ai la flemme de faire le bout de code qui donne la bonne chaine de caractères // donc ... iftp.of_ftp_setcurrentdirectory("/home") iftp.of_ftp_getcurrentdirectory(ls_toto) messagebox("debug",ls_toto) // me donne /home iftp.of_disconnect_session()
en utilisant ceci : http://www.topwizprogramming.com/freecode_ftpedit.html
Hors ligne
En fait ce que je faisai fonctionnais le seul soucis c'est que lorsque j'utilise FtpFindFirstFile pour le parcours d'un second dossier cela me renvoi 0 comme si il était vide.. donc je pensais que mon erreur venai de mon changement de dossier, FAUX ! ceci vient du fait que FtpFindFirstFile n'est possible qu'une seule fois par session ftp comme le dis microsoft :
FtpFindFirstFile is similar to the FindFirstFile function. Note, however, that only one FtpFindFirstFile can occur at a time within a given FTP session. The enumerations, therefore, are correlated with the FTP session handle. This is because the FTP protocol allows only a single directory enumeration per session.
Si quelqu'un connait donc une solution pour me renvoyer la liste des dossier ( jusque la je sais faire ) ainsi que les fichiers que chacun d'eux contient sur ftp, je suis preneur
merci
Hors ligne
essai un truc dans ce genre :
ai_level permet juste de faire un affichage hiérarchique dans la listbox
public function integer of_find (integer ai_level); string ls s_ftpdirlist dir_list[] long ll, li string ls_toto ll = iftp.of_ftp_directory(dir_list) iftp.of_ftp_getcurrentdirectory(ls_toto) for li=1 to ll lb_1.additem(space(ai_level*2) + dir_list[li].s_filename) if (dir_list[li].ul_attributes = 16) then iftp.of_ftp_setcurrentdirectory(ls_toto+"/"+dir_list[li].s_filename) of_find(ai_level+1) yield() iftp.of_ftp_setcurrentdirectory(ls_toto) end if next return 0 end function
le test "if (dir_list[li].ul_attributes = 16) then" est pas top, il faudrait un ET logique et je sais pas faire sous PB !
Hors ligne
if (dir_list[li].ul_attributes = 16)
c'est pour vérifier si c'est bien un répertoire?
Hors ligne
oui, en gros
mais il faudrait plutot faire, si je ne me trompe pas,
if (dir_list[li].ul_attributes [et binaire] 16) = 16 then
Hors ligne
lol ok ca pourra toujours servir je pense meme si c'est pas tout de suite:D
merci
Hors ligne
est-ce que le sujet est résolu ou il y a encore des points en suspend ?
Hors ligne
ben je me demande comment faire une boucle sur les fichier en évitant le FtpFindFirstFile qui n'est utilisable qu'une seule fois par session
Hors ligne
Pour en revenir sur ce FtpFindFirstFile, moi j'arrive à le lancer plusieurs fois dans une session ftp,
car j'appelle plusieurs fois la fonction of_directory dont voici le code
String ls_null, ls_retval Integer li_file Boolean lb_morefiles = True SetNull(ls_null) lul_hFind = FtpFindFirstFile(iul_session, ls_null, lstr_FindData, & INTERNET_FLAG_RAW_DATA + & INTERNET_FLAG_NO_CACHE_WRITE + & INTERNET_FLAG_RELOAD, 0) DO WHILE lb_morefiles li_file = li_file + 1 // get file name astr_dirlist[li_file].s_FileName = String(lstr_FindData.cfilename) astr_dirlist[li_file].s_AltFileName = String(lstr_FindData.calternatefilename) If Trim(astr_dirlist[li_file].s_AltFileName) = "" Then astr_dirlist[li_file].s_AltFileName = astr_dirlist[li_file].s_FileName End If // get file date/time astr_dirlist[li_file].dt_CreationTime = & this.of_FileDateTimeToPB(lstr_FindData.ftCreationTime) astr_dirlist[li_file].dt_LastAccessTime = & this.of_FileDateTimeToPB(lstr_FindData.ftLastAccessTime) astr_dirlist[li_file].dt_LastWriteTime = & this.of_FileDateTimeToPB(lstr_FindData.ftLastWriteTime) // get file size astr_dirlist[li_file].db_FileSize = (lstr_FindData.nFileSizeHigh * (2.0 ^ 32)) + & lstr_FindData.nFileSizeLow // get file attributes astr_dirlist[li_file].ul_Attributes = lstr_FindData.dwFileAttributes // find next file lb_morefiles = InternetFindNextFile(lul_hFind, lstr_FindData) LOOP // close out directory handle InternetCloseHandle(lul_hFind) Return UpperBound(astr_dirlist[])
Elle fait appel à FtpFindFirstFile, qui renvoit un handle, ce handle est clos à la fin de la fonction.
Est-ce que toi aussi tu faisais le "InternetCloseHandle" avant d'appeler à nouveau le "FtpFindFirstFile" ?
Et je me demande si ce que tu as lu sur le site de Microsoft ne signifierait pas plutot que lorsque tu fais
une enumération, il faut la terminer avant d'en lancer une autre.
Hors ligne
non je ne faisais pas ca je vais essayer ca, peut etre pourrait ton clore un des deux sujets car ils se sont rejoint la !
merci encore!
MODIF :
Dans une premiere boucle j'appele deja le FtpFindFirstFile pour obetnir la liste de mes dossier et ensuite pour chaque dossier j'appelle une fonction qui contient aussi ce fameux FtpFindFirstFile pour récupérer la liste de mes fichiers.
Comment procèderai tu à ma place ? car si je ferme ma connexion je perds la liste de mes dossier au niveau supérieur et repars au début .. je ne sais pas si je suis bien clair.
merci d'avance
Dernière modification par thezerg (06-12-2006 10:56:16)
Hors ligne
toujours en utilisant l'objet n_wininet de ftpedit.zip,
j'ai modifié ma fonction of_find, en rajoutant en paramètre le nom du répertoire destination : as_dir,
ensuite, ça donne :
string ls s_ftpdirlist dir_list[] long ll, li string ls_toto ll = iftp.of_ftp_directory(dir_list) //messagebox("debug",ls_toto) iftp.of_ftp_getcurrentdirectory(ls_toto) CreateDirectory(as_dir,0) for li=1 to ll lb_1.additem(space(ai_level*2) + dir_list[li].s_filename) if (dir_list[li].ul_attributes = 16) then iftp.of_ftp_setcurrentdirectory(ls_toto+"/"+dir_list[li].s_filename) of_find(ai_level+1,as_dir + "\" + dir_list[li].s_filename) yield() iftp.of_ftp_setcurrentdirectory(ls_toto) else iftp.of_ftp_getfile(dir_list[li].s_filename,as_dir+"\"+dir_list[li].s_filename,false) end if next return 0
avant de lancer la fonction, se placer dans le bon répertoire du ftp avec of_ftp_setcurrentdirectory
et voilà, ça me récupère toute l'arborescence du ftp, ainsi que les fichiers !!!
la fonction de création de répertoire (local external function pour moi) :
FUNCTION boolean CreateDirectory(ref string pathname, int sa) LIBRARY "Kernel32.dll" alias for "CreateDirectoryA"
bon, cé pas ce qu'il y a de plus clean comme code, à toi de faire le reste ! ;-)
Hors ligne
merci beaucoup ca avance
je vais voir si je peux faire quelque chose de récursif pour les répertoires dans les répertoires merci
Hors ligne
ps : le script que je viens de poster est déjà récursif, of_find fait appel à of_find !!!
Hors ligne
ps : merci :D
on peut mettre en résolu les 2 sujets :D
enfin...
Dernière modification par thezerg (06-12-2006 16:28:54)
Hors ligne