İnternetten dosya indirme (Cache&refresh)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
nosedive
Üye
Mesajlar: 238
Kayıt: 16 May 2004 07:48

İnternetten dosya indirme (Cache&refresh)

Mesaj gönderen nosedive »

Kod: Tümünü seç

uses
URLMon, ShellApi;

function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
   try
       Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
   except
       Result := False;
    end;
end;
Fonksiyonu ile ve

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
const
// İndirilecek dosyanın yeri
   SourceFile = 'Http://www.xxx.com/online.xml';

// dosyanın kaydedileceği yer
   DestFile = 'c:\temp\Haber.xml';
begin
   if DownloadFile(SourceFile, DestFile) then
   begin
       ShowMessage('İndirme işlemi başarılı !');
          end else begin
      ShowMessage(Hata : ' + SourceFile)
   end;
end;
şeklindede xml dosyasını indirme işlemi yapıyorum..Xml ile ilgili işlemler vs de sorun yok.Sorunum şu...Bu xml dosyasını ilk indirmede tamam indiriyor..ama program 5 dakikada bir bu xml i kontrol ediyor...ve ikinci kontrolde online.xml dosyasında bir değişiklik olsa bile sanıyorum cache den getiriyor ( kii ), değişen xml değil..ilk indirdiği xml dosyasını getiriyor...ve xml deki değişikliği algılamıyor...

Ancak xml in olduğu linki İE den açıp refresh ettiğiniz takdirde yeni xml i görebiliyor bu DownloadFile fonksiyonu...Ama garip olan programı yaptığım bilgisayarda bu sorun yok...yani yeni bir işlemi direk algılıyor ve en son xml dosyasını indiriyor...programı başla bilgisayara kurduğumda yukarda bahsettiğim sorun oluyor...Başka bir dosya indirme fonksiyonuda denedim yine aynı sorunu yaşadım..

Bunu çözmek için şunu yaptım..belki biraz saçma ama programa bi webbrowser ekleyip sayfayı açtırıp sayfayı refresh ettiriyordum..bu oluyor fakat program bu sefer donuyordu...

Kısacası webdeki dosyayı nasıl güncel olarak indidirim... İE deki refresh ( F5 ) gibi düşünün..

Teşk.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

XML dosyayı okuyup TEXT olarak basacak bir fonksiyon yaz. ve URL ile çağırırken şöyle birşey dene.

mesela GUNCELXML.ASP adlı bir sayfan var ve bu sayfa sana istediğin sonucu döndürüyor. Şimdi bu sayfayı şöyle çağır.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject); 
const 
// İndirilecek dosyanın yeri 
   SourceFile = 'Http://www.xxx.com/GUNCELXML.ASP?fn=';
   SourceFile = SourceFile + 'online.xml'; 
   SourceFile = SourceFile + '&tick=' + IntToStr(GetTickCount);

// dosyanın kaydedileceği yer 
   DestFile = 'c:\temp\Haber.xml'; 
begin 
   if DownloadFile(SourceFile, DestFile) then 
   begin 
       ShowMessage('İndirme işlemi başarılı !'); 
          end else begin 
      ShowMessage(Hata : ' + SourceFile) 
   end; 
end; 
Şimdi bu URL deki TICK değeri her defasında farklı olacağı için sayfa hiç CACHE'den gelmeyecektir.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Murat Hocam'ın yöntemi güzel bir yöntem, muhtemelen çalışır.
Ama M$ xml indirmek için bir nesne yapmış. Adı XmlHttpRequest Bu nesneyi kullanmayıda bir deneyin. Bu bir com nesnesi. Bu nesne Ajax teknolojisininde can damarıdır ayrıca. İndirdiiniz xml'in dom yapısına hemen erişebilirsiniz bu nesneyle. Bunla bir deneyin, inş. sorun bu yöntemle tekrar etmez.
Ayrıca proxy'den giriyorsanız, proxy'nin cacheide buna yol açıyor olabilir.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

yeni download yapmadan once cachedeki dosyayi silerseniz problem oolmaz

DeleteURLCacheEntry(SourceFile);
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
nosedive
Üye
Mesajlar: 238
Kayıt: 16 May 2004 07:48

Cache silmek

Mesaj gönderen nosedive »

Sadettinpolat ın bahsettiği func doğru...yani mantiken doğru..hatta bunu denedim..aynen tempten online.xml i sildiğiniz zaman yeni sayfayı indirebiliyorsunuz...

ancak

Kod: Tümünü seç

DeleteURLCacheEntry(SourceFile);
ile cache deki online.xml i silemiyorsunuz...Koda bakarsanız.. Sourcefile web adresinin bilgisini tutuyor..ben direk Temporary internet files klasorunun yolunu gostererek silmeye çalıştım..bu func ile onuda başaramadım...cache deki dosyayı silebilirsem sorun hal olacak...Şu anda bakıyorum...ama nasıl silebileceğim konusunda bilginiz var sa sevinirim...
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

undefined yazdı:Murat Hocam'ın yöntemi güzel bir yöntem, muhtemelen çalışır.
Ama M$ xml indirmek için bir nesne yapmış. Adı XmlHttpRequest Bu nesneyi kullanmayıda bir deneyin. Bu bir com nesnesi. Bu nesne Ajax teknolojisininde can damarıdır ayrıca. İndirdiiniz xml'in dom yapısına hemen erişebilirsiniz bu nesneyle. Bunla bir deneyin, inş. sorun bu yöntemle tekrar etmez.
Ayrıca proxy'den giriyorsanız, proxy'nin cacheide buna yol açıyor olabilir.

@undefined arkadaşımızın dediği aslında en mantıklısı. Şöyle ki, ben verdiğim örneği daha çok herhangi bir dosya indirmede kullanıyordum. Elbette XML için Delphi'de komutlar ve komponentler var. Fakat XML dosya çok büyük olacağını var sayarsak ve bunu ZIP veya RAR ile sıkıştırıp indirmek isterseniz dediğim yöntem iş görecektir.

Fakat ne hikmetse bu dediğim yöntemi ben bir yıldır kullanmıyorum, ICS ve INDY'nin HTTP bileşenlerini kullanıyorum ara ara, bir sorun çıkmıyor.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

DeleteUrlCacheEntry isinizi gormuyorsa bi yerde biseleri gozden kaciriyor olabilirsiniz zira bu api calisiyor. belki birden fazla kopyasi vardir , dosya aciktir. geriye donen degere bakarak islemin basarili olup olmadigini kontrol edebilirsiniz.

DeleteUrlCacheEntry delphi yazarak google da aramayi deneyin. en basitindan soyle bir link cikti karsima.

http://www.experts-exchange.com/Program ... 32128.html
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla