Strona 1 z 1

Pobieranie plików z HTTP bez INDY a cache [SOLVED]

Nowy postNapisane: niedziela, 21 czerwca 2009, 10:22
przez husky83
Witam,
Bazując na poradzie:

http://cyfbar.republika.pl/siec.html#siec14

chcę ściągnąć treść strony www
tak więc mam:
Kod: Zaznacz cały
AnsiString Url =  "http://cyfbar.republika.pl/index.html";
IStream* pStream;
Memo1->Clear();
URLOpenBlockingStream(0, Url.c_str(), &pStream, 0, 0);
std::auto_ptr<TOleStream> oStream(new TOleStream(pStream));
Memo1->Lines->LoadFromStream(oStream.get());


Wszystko działa przecudnie, ALE... funkcja pobierania strony ma być wywoływana cyklicznie (co kilkadziesiąt sekund), szukając zmian kilku rzeczy na stronie (mniejsza o szczegóły)... Problem polega na tym, że gdy po raz kolejny funkcja zostaje załadowana, pomimo zmian na stronie do Memo zostaje wczytany IDENTYCZNY tekst jak za pierwszym razem!!
Mało tego - jeśli usunę stronę z serwera, po wywołaniu funkcji NADAL jest wyświetlana zawartość strony !! Podejrzewam że pStream w jakiś sposób przechowuje pierwotną zawartość i nie ma zamiaru się jej pozbywać, stąd zawsze ta sama wartość :/ Proszę o pomoc :)

Re: Pobieranie plików z HTTP bez INDY

Nowy postNapisane: niedziela, 21 czerwca 2009, 10:39
przez wargo
Użyj:
Kod: Zaznacz cały
delete pStream;

po zakończeniu

Re: Pobieranie plików z HTTP bez INDY

Nowy postNapisane: niedziela, 21 czerwca 2009, 10:44
przez husky83
Też tak myślałem, wcześniej już z tym próbowałem ale:
1. nic to nie daje - efekt ten sam :(
2. Program zawiesza się po ok. minucie



EDIT:

dodałem teraz:
Kod: Zaznacz cały
URLDownloadToFile(0, main_url.c_str(), "TEsT", 0, 0);


(oczywiście w 'main_url' mam adres stronki)

i zrobiłem pewien test.. Uruchomiłem program, Został utworzony plik 'TEsT' zawierający kopie stronki z netu.. Co następnie zrobiłem:
- usunąłem plik TEsT
- zmieniłem zawartość strony
- kazałem programowi pobrać ponownie strone
- przeżyłem szok - funkcja URLDownloadToFile, pomimo że strona się zmieniła pobrała identyczną stronę jak na początku - jakby funkcje URLDownload* korzystały z jakiegoś cache...

Więc wina leży (prawdopodobnie) po stronie funkcji URLDownloadToFile, tudzież URLOpenBlockingStream. Raz wywołana funkcja tworzy cache, z którego potem pobiera zawartość (tak mi się wydaje)... Jak temu zapobiec?

Re: Pobieranie plików z HTTP bez INDY

Nowy postNapisane: niedziela, 21 czerwca 2009, 11:39
przez husky83
ROZWIĄZANIE PROBLEMU:

Kod: Zaznacz cały
#pragma comment(lib, "wininet.lib")


i przed wywołaniem funkcji URLDownloadToFile:
Kod: Zaznacz cały
DeleteUrlCacheEntry(main_url.c_str());


gdzie (AnsiString) main_url to adres stronki do której chcemy się odwołać.


Tak jak myślałem - plik był zapisywany do cache i w trakcie kolejnego odwołania był z niego odczytywany. Rozwiązanie więc banalnie proste - usunąć cache naszej stronki. A i nawet funkcja się do tego znalazła ;)
Całość wygląda zatem tak:
Kod: Zaznacz cały
AnsiString Url =  "http://cyfbar.republika.pl/index.html";   // Adres naszej stronki
IStream* pStream;
Memo1->Clear();
DeleteUrlCacheEntry(Url.c_str());    // Wyczyszczenie cache dla tego adresu
URLOpenBlockingStream(0, Url.c_str(), &pStream, 0, 0);  // pobranie stronki
std::auto_ptr<TOleStream> oStream(new TOleStream(pStream));
Memo1->Lines->LoadFromStream(oStream.get());




Można zamknąć i zostawić dla potomnych :)