CopyFile ve ProgressBar

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
S_Azeri
Üye
Mesajlar: 13
Kayıt: 29 Mar 2004 11:13

CopyFile ve ProgressBar

Mesaj gönderen S_Azeri »

Delphi 'de CopyFile(kaynak_dosya, kopyalanacak_dosya_adi, Boolean ) API fonksiyonunu kullanarak dosyayi kocuren zaman, bu dosyayi kocurme surecini ProgressBar ile gostermek olurmu? Yani dosyanin boyutu buyuk oldugunda ProgressBar usun sure harekety edicek, kucuk oldugunda az.
Onceden tesekkurler.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Kopyalama işlemini FileStream ile kendin yaparsan her adımda bir progressbar'ı tetikleyebilirsin...

- Diğer türlü CallBack operation sözkonusu olur ki oldukça detaylı bir işlem... Bu işlemn nasıl olduğu hakkında, SQL için @naile'nin verdiği linkte de araştırmış ama doyurucu bir cevaba rastlamamıştım.

- Önerim yulkarda bildirdiğim şekilde FileStream ile kopyalama işlemini yapman...
Resim
Resim ....Resim
S_Azeri
Üye
Mesajlar: 13
Kayıt: 29 Mar 2004 11:13

Max ve Min

Mesaj gönderen S_Azeri »

ProgressBar bileseninin Max ozelliyini koplalama surecine baglamak oluyormu?
Kullanıcı avatarı
mepc
Üye
Mesajlar: 191
Kayıt: 26 Eyl 2003 11:39
Konum: Ankara

Mesaj gönderen mepc »

Ben şöyle yapıyorum

Öncelikle kopyalanacak dosyaların bulunduğu klasörü filelistboxa aktarıyorum.

filelistbox1.Items.Count ile klasör içinde bulunan dosya sayısını progressbarın max ına eşitliyorum.

Daha sonra her dosya aktarıldığında prograssbarı 1 artırıyorum.

Tabi eğer aktaracağınız dosya sayısı fazla ise bu işe yarıyor. Ama büyük bir dosyayı aktaracaksanız klasörü windows apileri ile kopyalamanızı tavsiye ederim. (Windowsun klasik kopyalaması)
Bilgi paylaşıldıkça güzeldir.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Biraz vaktim vardı CallBack Function dediğim olayı biraz daha araştırınca şunu buldum.. CopyFile() yerine CopyFileEx() API'sini kullanırsan CallBack şansın oluyormuş...

- Denedim oluyor... Aşağıdaki kod tam istediğin işlemi gerçekleştiriyor...

- Formuna bir tane ProgressBar koy, adı otomatik olarak ProgressBar1 olacaktır... Button1 örneğindeki ProgressBar1, form üzerindekini simgeliyor...

Kod: Tümünü seç

Var
  FCancelled : Boolean;
function CopyFileWithProgressBar2(TotalFileSize,
  TotalBytesTransferred,
  StreamSize,
  StreamBytesTransferred: LARGE_INTEGER;
  dwStreamNumber,
  dwCallbackReason: DWORD;
  hSourceFile,
  hDestinationFile: THandle;
  lpData: Pointer): DWORD; stdcall;
begin
  // just set size at the beginning
  if dwCallbackReason = CALLBACK_STREAM_SWITCH then
    TProgressBar(lpData).Max := TotalFileSize.QuadPart;

  TProgressBar(lpData).Position := TotalBytesTransferred.QuadPart;
  Application.ProcessMessages;
  Result := PROGRESS_CONTINUE;
end;

function CopyWithProgress(sSource, sDest: string; ProgressBar : TProgressBar): Boolean;
begin
  // set this FCancelled to true, if you want to cancel the copy operation
  FCancelled := False;
  Result     := CopyFileEx(PChar(sSource), PChar(sDest), @CopyFileWithProgressBar2,
    ProgressBar, @FCancelled, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CopyWithProgress('D:\My Shared Folder\Britney Spears - Toxic (DVD Rip).mpeg', 'E:\deneme.mpg', ProgressBar1);
end;
- Başarılar... Sayende yeni bişi öğrenmiş olduk...
Resim
Resim ....Resim
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Bu mesaj ilk atıldığında copyfile ile yapılamayacagını soylemeye niyetlenmiştim ki sonra dur biraz bekliyim dedim... Bakın neler cıktı.... Gerci gene copyfile ile olmamış oldu ama... ;)
Neticede ufkumuz genişledi... Sağolun arkadaşlar.... :)
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
S_Azeri
Üye
Mesajlar: 13
Kayıt: 29 Mar 2004 11:13

Mesaj gönderen S_Azeri »

Ise yariyor. Chok tesekkur ederim.
Misafir

Soruya yeni başlık açmak istemedim, sorudur yani :)

Mesaj gönderen Misafir »

merhaba.
kopyalama işlemi esnasında bir progress ile durumu göstermemiz istendi.muharrem abinin kodlarını yazdım stabil çalıştı.ta ki bu sabaha kadar..kodlamaya devam ederken bu işlem aksamaya başladı.kopyalama yapmıyor genel olarak.fonksiyonu yeni bi projede denedim yine stabil çalışıyor.ancak üzerinde çalıştığımız projede kopyaladığı dosyayı (hedef) ortadan kaldırıyor ve yenisini yüklemiyor.aynı satırda copyfile apisi ile deniyorum yine stabil çalışıyor..bu ne yaman çelişkidir :roll:
saygılar..
burakk
Üye
Mesajlar: 5
Kayıt: 03 Oca 2005 05:41
Konum: Edirne
İletişim:

Mesaj gönderen burakk »

Merhabalar dediğiniz olayı copy procedur ile şu şekilde yapabilirsiniz:
kopyalanacak dosyaların olduğu klasörü filelistboxa aktarın.Ya da kopyalanacak dosyaların isimlerini bir memo nesnesine aktarın.Ben örnekte memoyu kullandım.Kodlar tam bu şekil değil.Mantığı göstermek açısından bir örnek:

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
var
b:Real;
z,y: Integer;
begin
Gauge1.MinValue:=0;
y:=Memo2.Lines.Count;
b:=100/y;
z:=Floor(b);
FileCopy ('c:\progra~1\dvd\data\1.08\Bnclient.dll', 'c:\oyun\Bnclient.dll');
Gauge1.Progress:=Gauge1.Progress+z;
FileCopy ('c:\progra~1\dvd\data\1.08\BNUpdate.exe','c:\oyun\BNUpdate.exe');
Gauge1.Progress:=Gauge1.Progress+z;
daha pratik bi şekilde "Gauge1.Progress:=Gauge1.Progress+z;" komutunu bir while do döngüsü ile de halledebilirsiniz iş sizin hayal gücünüze kalmış.Benim göstermek istediğim nokta klasördeki dosya sayısını alır ve 100'e bölersiniz böylece eğer klasörde 100 dosyanız varsa 100/100=1 den progressbar 1'er 1'er artar eğer 10 dosyanız varsa 100/10=10 dan 10'ar 10'ar artar.Umarım yardımcı olabilmişimdir.Galiba CopyFile ile oldu Fahrettin abi :)
Saygılar...
En son burakk tarafından 05 Oca 2005 12:46 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Daha iyi bir yaşam ancak daha iyi bir senle mümkün olabilir. O'Sensei Morihei Ueshiba
Misafir

Mesaj gönderen Misafir »

ilgin için teşekkür ederim..
ancak;
kasdettiğim olay kopyalanan dosya adedini göstermek değil, o an kopyalanan dosyanın kopyalanma durumunu göstermek.tıpkı findos gibi.ki muharrem abinin yazdığı kodlar bu işi yapıyo...
saygılar.
burakk
Üye
Mesajlar: 5
Kayıt: 03 Oca 2005 05:41
Konum: Edirne
İletişim:

Mesaj gönderen burakk »

Upps dikkatsiz gençlik.Yine de belki yazdıklarım kopyalanan dosyaları göstermek isteyenlere yardımcı olur :)
İyi çalışmalar...
Daha iyi bir yaşam ancak daha iyi bir senle mümkün olabilir. O'Sensei Morihei Ueshiba
Misafir

Mesaj gönderen Misafir »

tekrar merhaba.
olayı filestream ile hallettim.
saygılar..
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

merhaba,
olayı dosyayı byte byte okuyarakda yapabilirisin.
progressbar ın max ı dosyanın toplam boyutu olur,
with .. do içerisinde dosyadan okuduğun kadarını diğer dosyay yazarsın.
tabii bu arada progressbar value suda okuduğun byte.
kolay gelsin..
DeveloperToolKit

..::|YeşilMavi|::..
Misafir

Mesaj gönderen Misafir »

merhaba.
ilgin için teşekkür ederim.filestream yöntemiyle hallettim stabil çalışıyor..
kolay gelsin..
Cevapla