Dziwny problem z URLDownloadToFile

0

Witam,

Mam dziwny problem z funkcją URLDownloadToFile. Napisałem program, który co XX czasu ściaga plik na dysk z serwera (plik tekstowy). Wszystko działa poprawnie. Plik się ściąga, zapisuje na dysku i wyświetla ładnie jak trzeba. Program jest cały czas uruchomiony i ma za zadanie ściągać plik cały czas. Powiedzmy, że zmienie zawartość pliku na serwerze. Wtedy program znów ściąga go na dysk i tu właśnie pojawia się błąd. Po ściągnięciu nowego pliku (bo ma już inną zawartość) na dysku zapisuje się jego STARSZA wersja!.

Nie wiem kompletnie dlaczego tak się dzieje. Ktoś ma jakiś pomysł?
Próbowałem kasować plik z dysku przed ponownym ściągnieciem. Nic nie pomogło.

Jeśli ktoś cokolwiek kojarzy to proszę o pomoc. Dzięki ;)

0

Heh, ja tez miałem taki problem, ale po głębszym zastanowieniu się doszedłem do wniosku, że serwer HTTP potrzebuje trochę czasu na to, aby zaktualizować wsyztskie pliki znajdujące się na serwerze. Dlatego nowsza wersja pliku może być ściągana nawet z dużym opóźnieniem (wszystko zależy od serwera)...

0

A ja doszedłem do wniosku, że to wina API Windowsa. Najwyraźniej buforuje on ściągany plik i głupieje. Jak inaczej wytłumaczysz fakt, że po zaktualizowaniu pliku na serwerze dowolnym klientem FTP ZAWSZE pobierzesz dobrą wersję pliku?
Nie należy także zapominać, że URLDownloadToFile jest kontrolką Internet Explorera ;)

Udało mi się wczoraj wieczorem rozwiązać ten problem. Zamiast powyższej funkcji użyłem komponentu HTTP z pakietu Indy. Zadziałało MOMENTALNIE i nowy plik jest pobierany nawet sekundę po aktualizacji także nie mów, że to wina serwera :)
Nie wiem tylko jeszcze jak sobie poradzić z błędami HTTP (np. jeśli nie ma pliku na serwerze, a ja go próbuję ściągnąć). Z URLDownloadToFile było to proste, natomiast tutaj niebardzo wiem jeszcze jak to zrobić.

0

nowy plik jest pobierany nawet sekundę po aktualizacji także nie mów, że to wina serwera

A co powiesz na to, że przy ściąganiu poprzez Indy dzieje sięto samo ???
Tutaj tylko i wyłącznie wina serwera, bo Indy nie korzystają z żadnych bibliotek Explorerów, tylko wykorzystują podstawę, czyli sockety, a na tym poziomie nie ma żadnego buforowania plików.

Nie wiem tylko jeszcze jak sobie poradzić z błędami HTTP (np. jeśli nie ma pliku na serwerze, a ja go próbuję ściągnąć).

Tutaj wystarczy umieścić intrukcję HTTP.Get(...) pomiędzy try...except:

try
 try
  HTTP.Connect;
  HTTP.Get(Url_do_pliku);
 except
  raise Exception.Create('Wystąpił błąd przy próbie pobrania pliku');
 end;
finally
 HTTP.Disconnect;
end;
0

Pochwalony! Miałem ten sam problem nie tylko, ze ściąganiem plików, ale i umieszczaniem ich na serverze. Po umieszczeniu, tylko strona WWW widziała dany plik, gdy próbowałem go odpalić, ściągnąć stary mi się ściągał. Wydaje mi się, że jest to błąd Windows'a, to można nazwać ich uproszczeniem, mniestety jednak tak nie działa. Przykładowo, chcemy ściągnąć jakąś piosenkę. Podczas działania komputera, gdy będziesz ją od początku ściągał, ona będzie od razu załadowana (nawet gdy jest pokazane, że się ściąga!!). Po ponownym uruchomieniu komputera, plik będzie można ściągnąć prawidłowo od nowa. Chyba firma Microsoft dała coś takiego, aby w przypadku ściągania kilka razy tego samego pliku nie trzeba było czekać na jego ściągnięcie od początku. To jest jniestety tylko moja teoria, nie potrafiłem tego inaczej wyjaśnić :P

0

Przepraszam ze odkopuje stary temat, ale mam dokladnie taki sam problem, tyle ze niestety nie moge uzyc zadnych komponentow, bo pisze aplikacje konsolowa oto kod programu:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows,
  URLMon;

var
Plik : TextFile;
L : string;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  URLDownloadToFile(Nil, 'http://klub.chip.pl/chochlik/kom.txt' , 'C:\proba.txt' ,0,Nil);
  assignfile(Plik,'C:\proba.txt');
  Reset(plik);
  ReadLn(Plik,L);
  CloseFile(plik);
  MessageBox(0, Pchar(l), 'Success!', MB_OK or MB_ICONINFORMATION);
  URLDownloadToFile(Nil, 'http://klub.chip.pl/chochlik/kom.txt' , 'C:\proba2.txt' ,0,Nil);
  assignfile(Plik,'C:\proba2.txt');
  Reset(plik);
  ReadLn(Plik,L);
  CloseFile(plik);
  MessageBox(0, Pchar(l), 'Success!', MB_OK or MB_ICONINFORMATION);
end.

W sordku programu kiedy program czeka az klikne OK w MessageBoxie podmieniam plik kom.txt na serwerze, i po kliknieciu ok okazuje sie ze pliki proba.txt i proba2.txt sa identyczne chociash przed kliknieciem ok sprawdzalem czy plik prawidlowo sie zauplodowal przez przegladarke... I sie tak zastanawaim bo w przgladarce po wpisaniu adresu pliku pojawila mi sie zawartos starego pliku kom.txt , ale po kliknieciu refresh pojawila sie nowa zawartosc, i se msyle czy nie ma jakiegos sposobu zeby tutaj tesh dac programowi do zrozumienia ze trzeba plik sciagnac ponownie ?
Z gory dziekuje za pomoc....

1 użytkowników online, w tym zalogowanych: 0, gości: 1