Wininet FTP FtpFindFirstFile plusieurs fois

Résolu
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 6 oct. 2006 à 18:09
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

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 oct. 2006 à 18:30
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++
3
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
6 oct. 2006 à 18:10
Je voulais dire ouvrir plusieurs handles en même temps.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
6 oct. 2006 à 18:24
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 );
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
6 oct. 2006 à 18:33
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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;

}
0
Rejoignez-nous