Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [c++] InternetFindNextFile() (https://forum.scholieren.com/showthread.php?t=719018)

Dr HenDre 12-01-2004 17:07

[c++] InternetFindNextFile()
 
Ik ben momenteel bezig met een simpele FTP client, maar zelfs dat wil niet lukken. Ipv Winsock maak ik gebruik van WinInet, een versimpeld API waarmee je toch HTTP/FTP/Gopher applicaties kan maken. Anyway, ik kan nu dus wel connecten naar mn FTP, en ook inloggen, maar nu wil ik een lijst met wat erop staat.

Code:

/************** FtpFindFirsFile()***********************/       

        if((findFile =        FtpFindFirstFile(
                                                        handleInternet,
                                                        "*\0",
                                                        &win32_find_data,
                                                        INTERNET_FLAG_RESYNCHRONIZE,
                                                        NULL)))
        {
                cout<<"FtpFindFirstFile() succeed\n";
                if ((win32_find_data.dwFileAttributes &
                        FILE_ATTRIBUTE_DIRECTORY) ==
                        FILE_ATTRIBUTE_DIRECTORY )
                       
                        cout<<win32_find_data.cFileName<<" <DIR>\n";

                else
                        cout<<win32_find_data.cFileName<<endl;
        }
        else
        {
                cout<<GetLastError()<<endl;
        }
       
/************** InternetFindNextFile()***********************/       
       
        Sleep(1000);
        while(InternetFindNextFile(findFile , &win32_find_data))
        {
               
                if ((win32_find_data.dwFileAttributes &  FILE_ATTRIBUTE_DIRECTORY) ==
                        FILE_ATTRIBUTE_DIRECTORY )
                       
                        cout<<win32_find_data.cFileName<<"\t<DIR>\n";

                else
                        cout<<win32_find_data.cFileName<<endl;
        }
        if(!InternetFindNextFile(findFile , &win32_find_data))
        {
                DWORD dw=GetLastError();
                cout<<dw<<endl;    //RETURNS A IO ERROR CODE 997
        }

FtpFindFirstFile() zoekt het eerst bestand, slaat dat op in win32_find_data (struct WIN32_FIND_DATA), en geeft als return een handle waarmee je evt verder kan zoeken naar volgende bestanden(als de functie slaagt) en false als er een fout optreed. Nu gaat dit allemaal goed, vervolgens wil ik met InternetFindNextFile() alle volgende bestanden vinden(omdat ik als zoekteken * doorgeef). Maar ik krijg echter een 997 error.
MSDN zegt dat 997 voor Overlapped I/O operation is in progress staat. Ik heb van alles geprobeerd, maar ik blijf die error houden :( iemand enig idee wat ik fout doe

Screaming Slave 12-01-2004 18:20

nog nooit met die functie gewerkt, maar uhm, probeer eens van die laatste if statement,

Code:

if(!InternetFindNextFile(findFile , &win32_find_data))
{
  DWORD dw=GetLastError();
  cout<<dw<<endl;    //RETURNS A IO ERROR CODE 997
}

,

eens gewoon dit te maken.

Code:

DWORD dw=GetLastError();
cout<<dw<<endl;    //RETURNS A IO ERROR

je weet namelijk al dat Internet...data)) == false, aangezien het programma daar aangeland is (buiten de while loop). als je dan nog een keer FindNextFile doet, flipt ie misschien (ofzo). maar zoals gezegd, ken de achtergrond niet zo goed.

Lethalis 12-01-2004 18:53

Dat hij een error returned is opzich wel logisch.

De laatste call zal altijd false zijn. Je doet eerst een while en daarna weer een if met dezelfde conditie. Die is altijd false :p

Voor de rest zou ik gewoon eens cout << "hello world" in de compound block van mijn while zetten om te kijken of de functie InternetFindNextFile() ueberhaupt waar wordt.

Dr HenDre 12-01-2004 18:54

ja maar het probleem is dus juist dat het helemaal niet false moet zijn, hij moet true geven, maar waarom ie dat neit doet weet ik niet :(

Dr HenDre 12-01-2004 18:55

Citaat:

******** schreef op 12-01-2004 @ 19:53:
Dat hij een error returned is opzich wel logisch.

De laatste call zal altijd false zijn. Je doet eerst een while en daarna weer een if met dezelfde conditie. Die is altijd false :p

Voor de rest zou ik gewoon eens cout << "hello world" in de compound block van mijn while zetten om te kijken of de functie InternetFindNextFile() ueberhaupt waar wordt.

daar heb ik natuurlijk een geile debugger voor, hij slaat gewoon de while lus over omdat de functie false returnt. En dat is juist het probleem, waaaaaaarom returnt ie false?

Kawoutertje 12-01-2004 19:12

Citaat:

Dr HenDre schreef op 12-01-2004 @ 18:07:


Code:

/***** FtpFindFirsFile()***********/       

if((findFile =        FtpFindFirstFile(handleInternet,...



Die " findFile = FtpFindFirstFile", moet dat niet == zijn ipv = ?

Dr HenDre 12-01-2004 19:16

Citaat:

Kawoutertje schreef op 12-01-2004 @ 20:12:
Die " findFile = FtpFindFirstFile", moet dat niet == zijn ipv = ?
neej want in finFile moet de return waarde(een handle) van FtpFindFirstFile() worden opgeslagen. Je krijgt dan eik de condition

if(findFile), en dat werkt gewoon

Kawoutertje 12-01-2004 19:21

Citaat:

Dr HenDre schreef op 12-01-2004 @ 20:16:
neej want in finFile moet de return waarde(een handle) van FtpFindFirstFile() worden opgeslagen. Je krijgt dan eik de condition

if(findFile), en dat werkt gewoon

laat die "findFile =" er dan toch gewoon af, dat werkt normaal toch ook, niet ?

Nu ja, verder zie ik het probleem eigenlijk niet, sorry

Dr HenDre 12-01-2004 19:23

Citaat:

Kawoutertje schreef op 12-01-2004 @ 20:21:
laat die "findFile =" er dan toch gewoon af, dat werkt normaal toch ook, niet ?

Nu ja, verder zie ik het probleem eigenlijk niet, sorry

Het werkt wel, maar FtpFindFirstFile returnt een handle die je nodig hebt om door te gaan met zoeken. Want de functie InternetFindNextFile() accepteert als argument de handle die FtpFindFirstFile() returnt en de output buffer

Kawoutertje 12-01-2004 19:28

Zou het dan mss kunnen dat de true of false waarde die in de findFile wordt opgeslagen (daar in je if-statement) slechts lokaal wordt opgeslagen en dus eigenlijk terug op de vorige waarde springt nadat je uit het if-statement daar bent ?

Ik weet het niet hoor, ik ken niet zoveel van C++

Dr HenDre 12-01-2004 19:40

Citaat:

Kawoutertje schreef op 12-01-2004 @ 20:28:
Zou het dan mss kunnen dat de true of false waarde die in de findFile wordt opgeslagen (daar in je if-statement) slechts lokaal wordt opgeslagen en dus eigenlijk terug op de vorige waarde springt nadat je uit het if-statement daar bent ?

Ik weet het niet hoor, ik ken niet zoveel van C++

Nope, dat werkt ook niet. Was op zich niet zon heel gek idee, net effe geprobeerd, maar helaas :( Ik heb findFile als helemaal in het begin van mn main gedeclareerd, en ik hang er bij de if() alleen maar een waarde aan.

Code:

int main(void)
{
        HINTERNET handleInternet, handleConnect, findFile=0;
//rest va de code
}

Ik heb er nu het volgende van gemaakt, maar ook dat werkt niet

Code:

/************** FtpFindFirsFile()***********************/       
       
        findFile =        FtpFindFirstFile(
                                                handleInternet,
                                                "*\0",
                                                &win32_find_data,
                                                INTERNET_FLAG_RESYNCHRONIZE,
                                                NULL);


        if(findFile != NULL)
        {
                cout<<"FtpFindFirstFile() succed\n";
                if ((win32_find_data.dwFileAttributes &
                        FILE_ATTRIBUTE_DIRECTORY) ==
                        FILE_ATTRIBUTE_DIRECTORY )
                       
                        cout<<win32_find_data.cFileName<<"\t <DIR>\n";

                else
                        cout<<win32_find_data.cFileName<<endl;
        }
        else
        {
                cout<<GetLastError()<<endl;
        }
       
/************** InternetFindNextFile()***********************/       
       
        Sleep(1000);
        while(InternetFindNextFile(findFile , &win32_find_data))
        {
               
                if ((win32_find_data.dwFileAttributes &  FILE_ATTRIBUTE_DIRECTORY) ==
                        FILE_ATTRIBUTE_DIRECTORY )
                       
                        cout<<win32_find_data.cFileName<<"\t<DIR>\n";

                else
                        cout<<win32_find_data.cFileName<<endl;
        }
        if(!InternetFindNextFile(findFile , &win32_find_data))
        {
                DWORD dw=GetLastError();
                cout<<dw<<endl;    //RETURNS A IO ERROR CODE 997
        }


Kawoutertje 12-01-2004 19:58

dus als ik het goed begrijp zit er in de findFile in't begin een 0, en die wordt zoiezo overschreven door die FtpFindFirstFile ?
Wat voor waarde geeft die functie terug ? En wanneer moet dat if-statement true zijn ?

Zou het mss kunnen zijn dat die InternetFindNextFile geen booleaanse waarde terug geeft ? Wat doet die functie eigenlijk juist ?

Dr HenDre 12-01-2004 20:05

FindFirstFile()
Citaat:

Return Values
Returns a valid handle for the request if the directory enumeration was started successfully, or returns NULL otherwise. To get a specific error message, call GetLastError. If GetLastError returns ERROR_INTERNET_EXTENDED_ERROR, as in the case where the function finds no matching files, call the InternetGetLastResponseInfo function to retrieve the extended error text, as documented in Handling Errors.
findFile zou dus true moeten zijn(non-zero) als het werkt en NULL(zero) als er een error optreed.

InternetFindNextFile()

Citaat:

Return Values
Returns TRUE if the function succeeds, or FALSE otherwise. To get extended error information, call GetLastError. If the function finds no matching files, GetLastError returns ERROR_NO_MORE_FILES.

Kawoutertje 12-01-2004 20:38

Goh man, ik zie het echt niet hoor.

Hier nog enkele ideetjes waar het mss aan zou kunnen liggen maar hoogst waarschijnlijk ben je er niets mee hoor.

1.
Citaat:

After calling FtpFindFirstFile and until calling InternetCloseHandle, the application cannot call FtpFindFirstFile again on the given FTP session handle
Hieraan zal't waarschijnlijk niet liggen, want je roept die FtpFindFirstFile maar éénmaal op.

2. Ik vind die uitleg over die InternetFindNextFile nogal vaag. Zou het mss kunnen dat ie false moet zijn opdat jouw while-lus in werking zou treden, en false als ie eruit springt ? Wsl zal het dat ook niet zijn, maar je weet maar nooit !

3. Probeer anders eens je FindFirstFile(parameters) rechtstreeks in je InternetFindNExtFile(<hier dus>, parameters) te zetten.

Het zou echt wel sterk zijn mochten één van deze dingen het probleem oplossen, maar je kan maar proberen eh, misschien heb je wel geluk

Lethalis 12-01-2004 21:41

Geef ipv "*\0" gewoon eens null als parameter mee bij de findfirst.

Dr HenDre 12-01-2004 21:46

Citaat:

******** schreef op 12-01-2004 @ 22:41:
Geef ipv "*\0" gewoon eens null als parameter mee bij de findfirst.
Al gedaan, wil ook niet :(

Lethalis 12-01-2004 22:03

http://www.easysea.com/diannao/prog/c/bcbu/025.htm

Geef je in je connection functie ook hard mee dat het om een FTP verbinding gaat?

Dus, eerst:

FINet = InternetOpen("WININET1", 0, NULL, 0, 0);

Daarna:

FFtpHandle = InternetConnect(FINet, FServer, 0, FUserID, FPassword, INTERNET_SERVICE_FTP, 0, 255);

Anders weet de InternetFindNextFile() namelijk niet of het om een FTP of Gopher request gaat.

Dr HenDre 12-01-2004 22:04

Citaat:

******** schreef op 12-01-2004 @ 23:03:
http://www.easysea.com/diannao/prog/c/bcbu/025.htm

Geef je in je connection string ook hard mee dat het om een FTP verbinding gaat?

Dus, eerst:

FINet = InternetOpen("WININET1", 0, NULL, 0, 0);

Daarna:

FFtpHandle = InternetConnect(FINet, FServer, 0, FUserID, FPassword, INTERNET_SERVICE_FTP, 0, 255);

Anders weet de InternetFindNextFile() namelijk niet of het om een FTP of Gopher request gaat.

jep
http://rafb.net/paste/results/sJG11956.html


Alle tijden zijn GMT +1. Het is nu 12:46.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.