Wininet FTP FtpFindFirstFile plusieurs fois [Résolu]

Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
- - Dernière réponse : Oeil_de_taupe
Messages postés
150
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
16 février 2009
- 6 oct. 2006 à 21:12
Salut à tous,

J'ai besoin de pouvoir ouvrir plusieurs handles vers des fichiers sur serveur FTP.
Or, je ne peux en ouvrir qu'un.
L'appel d'un autre FtpFindFirstFile renvoie 0.
Est-ce normal ou y a-t-il un moyen de résoudre le problème et comment ?

Merci
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
3
Merci
MSDN nous dit:
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 donc FTP protocol ne veut pas...

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
0
Merci
Je voulais dire ouvrir plusieurs handles en même temps.
Commenter la réponse de Galmiza
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
0
Merci
Pour préciser un peu plus, j'utilise la dite fonction avec les paramètres.
HINTERNET hFind = FtpFindFirstFile(m_hFTPConnection, path, &wData, INTERNET_FLAG_RELOAD, 0);

Les path pour les appels de FtpFindFirstFile sont différents.

La connection ayant été initialisée ainsi (en retirant les étapes de vérification):
m_hInternetConnection = InternetOpen( "J-FTP", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 );
m_hFTPConnection = InternetConnect( m_hInternetConnection, server, port, login, pass, INTERNET_SERVICE_FTP, 0, 0 );
Commenter la réponse de Galmiza
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
0
Merci
Je suis désolé Brunews d'avoir posé une question dont la réponse était dans la doc MSDN.
Cependant, merci infiniment ;).
Je vais me débrouiller autrement...

Merci encore
Commenter la réponse de Galmiza
Messages postés
150
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
16 février 2009
0
Merci
Je me rappele avoir eu exectement le même problème pour lister le contenu d'un serveur FTP. Voilà la fonction que j'avais faite pour outrepasser cette limite. Il n'y a aucune assurance qu'elle marche! Je l'ai fait il y a plusieurs années. Je te laisse regarder si des bouts t'intéresse.

void ListElement(CFile* fEcriture, HINTERNET HwndFTP, char* chmFTP)
{

    //Parcours tous les fichier et dossier
    WIN32_FIND_DATA fEnum;
    //Sauvegarde dans le tas des dossiers
    WIN32_FIND_DATA* ficEnr = new WIN32_FIND_DATA[20];
   
    //Recupere le premier fichier et modification du chemin
    char* arbFichier = new char[strlen(chmFTP)+255];
    strcpy(arbFichier, chmFTP);
    strcat(arbFichier, "/");

    //Recherche du premier fichier
    HINTERNET premFichier = FtpFindFirstFile(HwndFTP, arbFichier, &fEnum, NULL, NULL);

    //Test de la validité du handle
    if(!premFichier)
    {
        cout << "Erreur de handle" << endl;
        return;
    }

    //Initialise la variable qui compte le nb de dossier
    int nbDossier = 0;
    do
    {   
        //Filtre dossier et fichier
        if (!(fEnum.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
            //Affiche les fichiers
            cout << "F:" << fEnum.cFileName << endl;
            char* AjoutFichier = new char[255];
            strcpy(AjoutFichier,fEnum.cFileName);
            strcat(AjoutFichier, "\r\n");
            fEcriture->Write(AjoutFichier, strlen(AjoutFichier));
            delete [] AjoutFichier;
        }else{
            //Affiche les dossier et les enregistre
            //cout << "D:" <<  fEnum.cFileName << endl;

            if(nbDossier < 19)
            {
                *(ficEnr + nbDossier) = fEnum;
                nbDossier++;
            }

        }
    }while(InternetFindNextFile(premFichier, &fEnum));

    //Ferme le handle de recherche de fichier dans le rep
    InternetCloseHandle(premFichier);

    //Traite maintenant les dossier du rep, pour pouvoir tous les inspecter
    for(int i = 0; i < nbDossier; i++)
    {
        char* arbSousFich = new char[strlen(chmFTP)+255];
        strcpy(arbSousFich, arbFichier);
        strcat(arbSousFich, (ficEnr+i)->cFileName);
        ListElement(fEcriture, HwndFTP, arbSousFich);
        delete [] arbSousFich;
    }

    delete [] ficEnr;
    delete [] arbFichier;

}
Commenter la réponse de Oeil_de_taupe